Redis事务的简单理解

Redis事务的命令如下所示:

先以 MULTI 开始一个事务, 然后将多个命令入队到事务中, 最后由 EXEC 命令触发事务, 一并执行事务中的所有命令

示例如下:

复制代码
//开始一个事务
127.0.0.1:6379> MULTI
OK
//将3个元素添加到集合set-test中
127.0.0.1:6379> SADD set-test c java c++
QUEUED
//遍历set-test集合
127.0.0.1:6379> SMEMBERS set-test
QUEUED
//触发事务
127.0.0.1:6379> EXEC 1) (integer) 3 2) 1) "c++" 2) "java" 3) "c" 127.0.0.1:6379>
复制代码

 

 

 Redis 事务可以一次执行多个命令, 并且带有以下特征:

  • 批量操作在发送 EXEC 命令前被放入队列缓存。
  • 收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。
  • 在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。

注意:Redis的事务没有关系数据库事务提供的回滚(rollback) 功能,因此必须在事务执行出错后进行处理(比如将数据库复原回事务执行前的状态等)。

由于Redis不支持回滚功能,也使得Redis在事务上可以保持简洁和快速。

因此,在Redis事务中会出现两类错误:
1.命令语法错误、参数错误等,命令没有进入事务的命令队列,直接就返回错误。
2.命令进入事务的命令队列,但在执行EXEC后出错,例如对错误的数据类型使用了不支持的操作。

 

客户端可以在事务提交前就感知到第一类错误,一般客户端在收到第一类错误时会discard当前事务。
Redis2.6.5之前的版本在执行EXEC时会忽略第一类错误,执行队列中的其他命令。
Redis2.6.5之后的版本会记录第一类错误,当执行EXEC命令时返回:
(error) EXECABORT Transaction discarded because of previous errors.
对于第二类错误,Redis会忽略失败的命令,继续执行队列中的其他命令。即一个事务内的操作,可能会出现一部分成功,一部分失败的情况。

第一类错误,如下所示:

复制代码
//开始一个事务
127.0.0.1:6379> MULTI
OK
//将3个元素添加到集合set-test中
127.0.0.1:6379> SADD set-test c java c++
QUEUED
//遍历set-test集合的命令出错
127.0.0.1:6379> SMEMBERS
(error) ERR unknown command 'SMEM'
//正确的遍历命令
127.0.0.1:6379> SMEMBERS set-test
QUEUED
127.0.0.1:6379>
//触发事务不成功
127.0.0.1:6379> EXEC
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379>
复制代码

 

posted on   乐之者v  阅读(1435)  评论(0编辑  收藏  举报

编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示