一.Redis自带事务机制
Redis事务通过MULTI 、 EXEC 、 DISCARD 、WATCH和UNWATCH命令操作,过程如下:
通过MULTI 开启事务,然后添加任意条命令到队列,通过EXEC 执行队列命令,通过DISCARD 放弃事务,通过WATCH提供锁机制,通过UNWATCH取消对key的监控。
例1:普通用法
127.0.0.1:6379> multi
OK
127.0.0.1:6379> incr aaa
QUEUED
127.0.0.1:6379> incr bbb
QUEUED
127.0.0.1:6379> exec
1) (integer) 1
2) (integer) 1
例2:放弃事务
127.0.0.1:6379> set aaa 1
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> incr aaa
QUEUED
127.0.0.1:6379> discard
OK
127.0.0.1:6379> get aaa
"1"
例3:WATCH锁机制(如下,如果被监控的key在exec前被修改了,则事务失败)
127.0.0.1:6379> watch aaa
OK
127.0.0.1:6379> set aaa 100
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set aaa 200
QUEUED
127.0.0.1:6379> exec
(nil)
127.0.0.1:6379> get aaa
"100"
例4:Redis会忽略入队失败的命令或错误的命令
127.0.0.1:6379> multi
OK
127.0.0.1:6379> incr b
QUEUED
127.0.0.1:6379> set c 1 2
QUEUED
127.0.0.1:6379> exec
1) (integer) 1
2) (error) ERR syntax error
127.0.0.1:6379> get b
"1"
127.0.0.1:6379> get c
(nil)
如上可见,Redis为了保证高效和快速并不支持回滚(rollback),但提供了脚本实现事务
。
二.使用Lua脚本实现事务
Redis可调用Lua解析器去运行脚本,Redis会保证脚本以原子性方式运行,执行多条命令还可减少网络开销,但是执行运行时间很长脚本可不是什么好主意。
通过EVAL命令去执行Lua脚本,通过redis.call()函数来调用redis命令。(详情见redis文档)
例1:eval和redis.call使用
127.0.0.1:6379> eval "return redis.call('set',KEYS[1],'bar')" 1 foo
OK
127.0.0.1:6379> get foo
"bar"
荒野乱斗国际版 (BrawlStars)最新版本v56.274
下载一波超人内置修改器菜单版 安卓版v1.0.2
下载敢达决战官方正版 安卓版v6.7.9
下载敢达决战 安卓版v6.7.9
下载继承了一座戏园子无限声望铜钱版 内置菜单最新版v1.7
继承了一座戏园子折相思版是游戏的破解版本,在该版本中为玩家提
山河半世橙光清软金手指版 无限鲜花v3.24
山河半世是一款超级好玩的橙光恋爱游戏,在游戏中玩家们需要扮演
蓬莱手游折相思版 安卓版v1.0.0
蓬莱免广告版是游戏的修改版本,在该版本中为玩家去除了广告,玩
当红影后橙光游戏破解版2025 最新版v1.0
当红影后橙光破解版是一款超级好玩的娱乐圈题材的橙光游戏,在这
忽然成了万人迷清软完结版 无限鲜花版v12.15
忽然成了万人迷破解版是一款非常好玩的男性向橙光游戏,在有一天