Redis watch命令——监控事务

时间:2022-10-20 09:38:42

在 Redis 中使用 watch 命令可以决定事务是执行还是回滚。一般而言,可以在 multi 命令之前使用 watch 命令监控某些键值对,然后使用 multi 命令开启事务,执行各类对数据结构进行操作的命令,这个时候这些命令就会进入队列。

当 Redis 使用 exec 命令执行事务的时候,它首先会去比对被 watch 命令所监控的键值对,如果没有发生变化,那么它会执行事务队列中的命令,提交事务;如果发生变化,那么它不会执行任何事务中的命令,而去事务回滚。无论事务是否回滚,Redis 都会去取消执行事务前的 watch 命令,这个过程如图 1 所示。

图片.png

Redis 在执行事务的过程中,并不会阻塞其他连接的并发,而只是通过比较 watch 监控的键值对去保证数据的一致性,所以 Redis 多个事务完全可以在非阻塞的多线程环境中并发执行,而且 Redis 的机制是不会产生 ABA 问题的,这样就有利于在保证数据一致的基础上,提高高并发系统的数据读/写性能。

Redis事务常用命令:

序号命令及描述
1DISCARD
取消事务,放弃执行事务块内的所有命令。
2EXEC
执行所有事务块内的命令。
3MULTI
标记一个事务块的开始。
4UNWATCH
取消 WATCH 命令对所有 key 的监视。
5WATCH key [key ...]
监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。

下面演示一个成功提交的事务:

这里我们使用了 watch 命令设置了一个 test1 的监控,然后开启事务设置 test2,直至 exec 命令去执行事务,这个过程和图 2 所演示的一样。

序号执行命令描述
t1flushdb清空所有数据慎重
t2set test1 1初始化test1的值
t3watch test1监控 test1 的键值对
t4multi开启事务
t5set test2 2设置test2的值(加入事务队列)
t6exec提交事务,可对结果进行判断
t7get test2获取test2的值

下面演示一个不成功的提交的事务:

图片.png

序号线程1命令线程2命令描述
t1flushdb清空所有数据慎重
t2set test1 1初始化test1的值
t3watch test1监控 test1 的键值对
t4set test1 11变更被监控的test1键值对
t5multi开启事务
t6set test2 2设置test2的值(加入事务队列)
t7exec执行事务,但是事务会先检査在t3 时刻被监控的 test1 是否被其修改过。
因为线程2 修改过,所以它会回滚事务,事实上如果某线程执行的是 set test1 value1 命令,它也会认为 key1 被修改过,然后返回(nil),所以是不会产生 ABA 问题的
t8get test1获取test1的值
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值