Redis-监控Watch(面试常问!)

本文介绍了Redis中的乐观锁实现,通过`WATCH`命令监控数据并使用`MULTI/EXEC`事务处理。当多线程修改同一值时,事务会因数据变动而失败,此时需解锁并重新尝试事务。这种机制在并发环境下提供了数据一致性保障。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

提示:本文章是日常学习内容的总结,并非全部原创;仅供大家参考借鉴,并无其他商业用途。Bilibili搜索关注:狂神说
真正在公司中的实践:NoSQL + RDBMS 一起使用才是最强的,阿里巴巴的架构演进!
技术没有高低之分,就看你如何去使用!(提升内功,思维的提高!)
云计算的长征之路:阿里云的这群疯子

概括

悲观锁:

很悲观,认为什么时候都会出问题,无论做什么都会加锁!

乐观锁:

很乐观,认为什么时候都不会出问题,所以不会上锁!
更新数据的时候去判断一下,在此期间是否有人修改过这个数据,
获取version,更新的时候比较 version

1、Redis测监视测试

1.1、正常执行成功

127.0.0.1:6379> set money 100 
OK
127.0.0.1:6379> set out 0 
OK
127.0.0.1:6379> watch money         # 监视 money 对象 
OK
127.0.0.1:6379> multi               # 事务正常结束,数据期间没有发生变动,这个时候就正常执行成功! 
OK
127.0.0.1:6379> DECRBY money 20 
QUEUED 
127.0.0.1:6379> INCRBY out 20
QUEUED 
127.0.0.1:6379> exec 
1) (integer) 80 
2) (integer) 20

1.2、测试多线程修改值 ,事务执行失败 返回(nil)

打开另一个redis-cli客户端,在其exec提交事务之前;修改money对象的值
使用watch 可以当做redis的乐观锁操作!
很乐观,不上锁! 只在更新数据的时候去判断一下,在此期间是否有人修改过这个数据,

127.0.0.1:6379> watch money           # 监视 money 
OK
127.0.0.1:6379> multi 
OK
127.0.0.1:6379> DECRBY money 10 
QUEUED 
127.0.0.1:6379> INCRBY out 10 
QUEUED 
127.0.0.1:6379> exec                  # 执行之前,另外一个线程,修改了我们的值,这个时候,就会导致事务执行失 败!
(nil)

1.2.1、如果事务修改失败,怎么办?

先解锁money对象,再重新监视money对象的最新值,最后exec重新提交事务

在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值