缓存中间件-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
其过程如图所示
具体命令
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是否被其他客户端修改,都会执行事务队列并返回结果。
获取更多即时消息,请关注公众号