`
lfq618
  • 浏览: 88422 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Redis–事务(Multi和CAS)的实现

 
阅读更多

Redis也有事务的功能,但是这个事务可能跟MySQL之类的RDBMS不同。官网上的Transactions介绍了Redis中的事务。Redis中使用multi和exec命令设定事务边界,discard在multi命令提交后可丢弃事务。另外watch命令可以实现CAS操作。

 

Redis中的事务归纳一下有这么几个特点
  • 在multi和exec之间的命令作为事务处理,所有命令视为原子性操作,不能打断。
  • 在multi和exec之间的命令如果某条命令发生错误不回滚事务,也就是说,除了出错的命令,其他正常执行。
  • 如果开启AOF机制,那么multi和exec的之间的命令也会用一条write命令写到硬盘。如果在写时被硬中断(停电或管理员强制kill),Redis重启时会检测到错误,可以用redis-check-aof工具修复。
  • 支持CAS(check and set)操作,watch命令可以锁定某个key,unwatch命令取消锁定,在事务执行时如果检测到watch的key被修改,事务失败。事务成功执行后,会unwatch掉所有观察的keys。

这里需要解释的是为什么Redis提供的事务不支持错误回滚?原因是Redis作为缓存系统,命令被编程到程序里一般不会出错(错误如参数个数出错,类型出错等),如果发生出错,说明是程序出现了问题,在生产环境下一般不会这类问题。并且这样的事务在Redis实现非常简单,因为Redis是单线程程序,所以只要存储事务操作最后一起执行就实现了原子性操作,如果增加回滚会影响Redis性能。 CAS操作应用于下面这个场景 watch stringA stringA_r = stringA + “abcd” multi set stringA string_r exec 这类场景很常见,当stringA被watch后如果发生变动,那么下面的事务就会失败。

分享到:
评论

相关推荐

    记录redisson实现redis分布式事务锁

    本篇文章将详细探讨如何使用Redisson实现Redis分布式事务锁,以及在Spring Boot环境中如何进行集成。 首先,Redis作为一个内存数据库,其高速读写性能使其成为实现分布式锁的理想选择。分布式锁的主要作用是在多...

    redis的高级事务CAS(乐观锁).rar

    总结来说,Redis 的事务和 CAS 实现提供了一种高效且并发友好的方式来管理数据。通过使用 Lua 脚本或 `WATCH` 命令,我们可以实现对数据的乐观锁控制,确保在多客户端并发访问时的数据一致性。虽然 Redis 不像传统的...

    springboot-redis事务

    在处理Redis事务时,我们需要根据实际需求选择合适的方法,可能是简单的`MULTI/EXEC`,也可能是基于Lua脚本的分布式事务,甚至采用更复杂的分布式事务管理框架。理解这些概念和技术,有助于我们在实际项目中更好地...

    redis事务与关系型数据库事务比较

    - MySQL 使用 `START TRANSACTION` 来开始一个事务,而 Redis 使用 `MULTI` 命令。 2. **回滚操作**: - MySQL 通过 `ROLLBACK` 事务来撤销已执行的操作,Redis 使用 `DISCARD` 命令取消事务,但它不会回滚已...

    cpp-Redis分布式事务

    总结来说,要在C++中利用Redis实现分布式事务,我们需要理解Redis的基本命令和特性,如原子操作、发布/订阅、分布式锁和Lua脚本等。同时,选择合适的C++ Redis客户端库,并注意处理并发控制和数据一致性问题,是成功...

    08-Redis HyperLogLog与事务和Redis 7.0那点事-ev.rar

    08-Redis HyperLogLog与事务和Redis 7.0那点事_ev.rar08-Redis HyperLogLog与事务和Redis 7.0那点事_ev.rar08-Redis HyperLogLog与事务和Redis 7.0那点事_ev.rar08-Redis HyperLogLog与事务和Redis 7.0那点事_ev.rar...

    cas-client 基于redis自定义实现

    总结起来,这个"cas-client 基于redis自定义实现"项目是将标准的CAS客户端与Redis集成,以提升性能和扩展性,并解决了原版可能存在的问题。通过自定义文档和源码,其他开发者可以学习和复用这些改进,以适应自己的...

    redis事务常用操作详解

    从Redis 2.2版本开始,Redis引入了乐观锁机制,通过`WATCH`命令实现CAS(Check-and-Set)操作。这种方式允许在事务执行前检查键的当前状态,如果在事务执行过程中键的状态改变,事务会被取消。 总的来说,Redis的...

    springboot+shiro+cas+redis+mybatis+thymeleaf 集成开发框架

    由于项目需要从网上搜集的相关的集成框架,很多都是部分集成,一直没有找到整个流程全部集成好的,所以将集成好的框架分享出来供...主要实现SSO、后台RBAC角色认证管理。 下载后需要自行修改配置,项目包内带sql脚本

    redis事务_动力节点Java学院整理

    Redis 事务的实现主要集中在源码的 `multi.c` 文件中。`multiCommand` 函数负责开启事务,它会设置客户端的 `REDIS_MULTI` 标志。当客户端发送 `EXEC` 命令时,Redis 会检查事务中的所有命令,并依次执行。如果在...

    Redis事务及CAS(Check-And-Set)机制

    Redis事务和CAS(Check-And-Set)机制是Redis中用于处理并发操作的重要特性,确保数据的一致性和完整性。在高并发的网络活动中,如证券交易,这类机制是必不可少的。 Redis事务通过`MULTI`, `EXEC`, `DISCARD`, 和 ...

    基于mq和redis实现的秒杀系统

    3. **事务处理**:在Redis中,可以利用`WATCH`命令实现分布式事务,保证数据操作的完整性。 4. **回滚策略**:当秒杀过程中出现问题,应有回滚机制恢复系统状态。 5. **监控与报警**:设置完善的监控体系,及时发现...

    redis主从配置及通过keepalived实现redis自动切换

    Redis 主从配置及通过 Keepalived 实现 Redis 自动切换 标题:Redis 主从配置及通过 Keepalived ...Redis 主从配置及通过 Keepalived 实现 Redis 自动切换可以实现高可用性和自动故障转移,提高系统的可靠性和稳定性。

    RedisConnect是基于C++11实现的简单易用的Redis客户端

    RedisConnect是基于C++11实现的简单易用的Redis客户端。源码只包含一个头文件与一个命令行工具源文件,无需编译安装,真正做到零依赖。自带连接池功能,调用Setup方法初始化连接池,然后执行Instance方法就可以获取...

    Redis的Java客户端和服务端实现.zip

    Redis的Java客户端和服务端实现一个非常快的 JVM Redis 客户端。各模块说明重新生成/ 抓取 redis.io/commands 页面并生成各种类型的客户端和服务器,扩展性非常好工具/ 一些常见的编码和数据结构客户/ 利用协议模块...

    redis常用命令,redis配置文件,redis持久化,redis事务,redis主从复制,jedis的使用

    * MULTI:开始事务 * EXEC:执行事务 * DISCARD:放弃事务 Redis 主从复制 Redis 的主从复制可以实现数据的实时同步。从节点可以从主节点同步数据,从而实现高可用性和负载均衡。 * SLAVEOF host port:设置从...

    redis事务回滚工具

    基于SpringBoot的轻量级redis事务回滚机制,使用栈和ThreadLocal记录业务链的redis操作,发生异常进行回滚,参考了阿里巴巴Seata AT模式的db回滚策略:补偿回滚,记录前镜像与当前操作语句,反向解析生成补偿动作。...

    redis面试题之事务.zip

    2. **事务中的错误处理**:在`MULTI`和`EXEC`之间的命令如果出现错误,Redis不会中止事务,而是继续执行队列中的后续命令。这意味着事务内的所有命令都会被执行,但可能某些命令的结果无效。 3. **WATCH命令**:...

    Java实现Redis的消息订阅和发布

    本篇文章将深入探讨如何使用Java来实现Redis的消息订阅和发布功能,这在分布式系统和实时数据处理中非常关键。 首先,理解Redis的发布/订阅(Pub/Sub)模式是至关重要的。在这一模式下,Redis服务器作为消息的中间...

    剖析!Redis事务实现原理

    所谓事务(Transaction),是指...事务执行以下是一个最简单的Redis事务流程:第一步跟其他的关系型数据库类似,也是需要开启一个事务,在Redis中的命令如下:Redis中使用MULTI命令标记事务的开始,可以理解为在传统关

Global site tag (gtag.js) - Google Analytics