欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

缓存中间件-redis的事务-multi-exec-watch的原理

程序员文章站 2022-04-05 18:57:54
...

世界上并没有完美的程序,但是我们并不因此而沮丧,因为写程序就是一个不断追求完美的过程。

关于redis的事务是通过multi,exec,watch三个命令实现的。
具体过程如下

1. 执行 watch key 监控事务中要操作的字段
2. 执行 multi 开启事务
3. 写入具体的业务操作
4. 执行 exec 并返回执行结果

接下来解析原理

首先 watch 监控 key 所起的作用实际上是一个乐观锁,它所监控的是在事务期间有没有其他客户端对所监控的值进行修改,通过REDIS_DIRTY_CAS作为标志位,如果key对应的值被其他客户端修改了则开启REDIS_DIRTY_CAS,如果没有被修改则不开启REDIS_DIRTY_CAS。
然后 multi 的作用是开启事务,如果执行了 multi 则表示开启事务,那么接下来发送到客户端的命令不会立即执行,而是被加入到一个FIFO的队列中,直到遇到 exec 命令,则队列中的命令会依次执行并根据先进先出的顺序返回执行结果。
执行 exec 命令时,首先会判断REDIS_DIRTY_CAS是否开启,如果开启,说明key的值已经被其他客户端修改过了,这时就不会再执行事务队列中的命令而是会返回(nil),如果REDIS_DIRTY_CAS没有开启,说明在执行事务期间key没有被修改,则继续执行事务队列并返回执行结果。
还有一点,一个watch对应的是一个事务,再开启一个事务时需要提前设置watch

其过程如图所示
缓存中间件-redis的事务-multi-exec-watch的原理
具体命令

watch hello name
multi
set hello good
get hello
set name good
get name
exec

如果在事务执行期间hello和name没有被修改过(REDIS_DIRTY_CAS没有开启),则输出

OK
good
OK
good

如果在事务执行期间hello和name被修改过(REDIS_DIRTY_CAS开启),则输出

(nil)

如果不加watch命令,即事务中去掉了乐观锁,那么无论事务中的key是否被其他客户端修改,都会执行事务队列并返回结果。

获取更多即时消息,请关注公众号
缓存中间件-redis的事务-multi-exec-watch的原理

相关标签: 中间件