Redis事务
一、Redis事务概述
Redis事务是一个单独的隔离操作,事务中所有的命令都会序列化、按顺序执行,事务在执行的过程中不会被其它客户端发送过来的命令所打断.
Redis同一事务中如果有一条命令执行失败,其它的命令仍然会被执行,没有回滚.
Redis事务的主要作用是串联多个命令,防止别的命令插队.
二、Redis事务的几个阶段
1、开始事务
2、事务入队
3、执行事务
三、Redis事务相关命令
watch key1 key2:监视一个或多个key,如果监视的key被其它命令所修改,则事务被打断(类似于悲观锁中比较版本号,而Redis是比较key是否被修改过)
multi:标记Redis事务的开始
discard:放弃事务
exec:执行事务
unwatch:取消watch对所有key的监视
一、Redis正常开启事务,执行事务. 127.0.0.1:6379> multi OK 127.0.0.1:6379> hincrby role role:9527:age 2 QUEUED 127.0.0.1:6379> hincrby role role:9527:age 3 QUEUED 127.0.0.1:6379> hincrby role role:9527:age -5 QUEUED 127.0.0.1:6379> exec 1) (integer) 24 2) (integer) 27 3) (integer) 22 二、Redis放弃事务. 127.0.0.1:6379> multi OK 127.0.0.1:6379> hmset role role:9527:birthday 1992-10-10 QUEUED 127.0.0.1:6379> hexists role role:9527:id QUEUED 127.0.0.1:6379> hkeys role QUEUED 127.0.0.1:6379> discard OK 三、Redis在事务队列中存在语法性错误(类似于java中的运行时异常),则执行exec命令时,正确的命令会被执行,错误的命令会抛出异常. 127.0.0.1:6379> multi OK 127.0.0.1:6379> hkeys role QUEUED 127.0.0.1:6379> hvals role QUEUED 127.0.0.1:6379> hincrby role role:9527:name 3 QUEUED 127.0.0.1:6379> exec 1) 1) "role:9527:id" 2) "role:9527:name" 3) "role:9527:age" 2) 1) "9527" 2) "xiaomaomao" 3) "22" 3) (error) ERR hash value is not an integer 四、Redis在事务队列中出现命令性异常(类似于java中的编译期异常),则执行exec命令的时候所有命令都不会执行. 127.0.0.1:6379> multi OK 127.0.0.1:6379> hexists role role:9527:name QUEUED 127.0.0.1:6379> hget role (error) ERR wrong number of arguments for 'hget' command 127.0.0.1:6379> hsetnx role role:9527:gender female QUEUED 127.0.0.1:6379> exec (error) EXECABORT Transaction discarded because of previous errors. |
watch:
情况一:左边客户端设置balance=100、debt=0---->左边客户端和右边客户端同时查询,结果都是balance=100,debt=0---->左边客户端watch balance debt---->
---->muti开启事务---->设置balance=80、debt=20---->exec执行事务---->左右客户端同时查询balance、debt,显示结果为80和20.
情况二:左边客户端设置balance=100、debt=0---->左右客户端同时查询balance、debt显示结果为balance=100、debt=0---->左边客户端监视balance、debt---->使用muti命令开启事务---->事务入队set balance 80、set debt 20---->右边客户端设置balance 200---->左边客户端使用命令exec执行事务---->显示事务执行失败---->左右客户端同时查询balance、debt---->显示的结果为balance=200、debt=0
注:一旦使用exec命令执行事务后,无论事务是否执行成功,watch对key的监控都会被移除,所以当事务执行失败后如果还想对key进行监控,就必须再一次使用watch key1 key2...命令对指定的key监控,并开启新的事务操作.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?