Redis乐观锁

Redis 乐观锁

乐观锁:乐观锁认为数据一般情况不会出现问题,所以不会上锁;只有在更新数据时才去判断一下在此期间是否有人修改过此数据;

实现:乐观锁一般是通过版本号Version来实现的,当数据发生改变时,对应的Version也会进行修改;当一个线程 thread1 进行更新操作时,读取数据的同时也会读取对应的Version,修改完数据执行更新操作时,将读取到的Version与库中的Version进行比较,相同时执行更新操作,不同则执行失败;

redis乐观锁通过监视 WATCH 来实现的 :
  1. 使用 WATCH 对被操作key进行监控,并获取到当前 key 的 value;
  2. 开启事务(MULTI),执行名令;
  3. 执行事务(EXEC);
  4. 执行事务后,此时的 WATCH 会将此前获取到的被操作的 key 的 value 与被操作的 key 当前的 value 进行比较,相同则执行,不同则执行失败返回nil;
  5. 若事务执行失败,则使用 UNWATCH 先解锁;然后使用 WATCH 获取到最新的 value 再次进行监视,再执行相应的动作;

正常示例:

127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> mset a-money 100 b-money 150
OK
127.0.0.1:6379> watch a-money # 监视 a-money
OK
127.0.0.1:6379> multi  # 开启事务
OK
127.0.0.1:6379> decrby a-money 20  # 执行命令
QUEUED
127.0.0.1:6379> incrby b-money 20
QUEUED
127.0.0.1:6379> exec # 执行事务
1) (integer) 80
2) (integer) 170

异常示例:

在这里插入图片描述
在这里插入图片描述

线程 Thead1
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> mset a-money 100 b-money 150
OK
127.0.0.1:6379> watch a-money # 监视 a-money
OK
127.0.0.1:6379> multi # 开启事务
OK
127.0.0.1:6379> decrby a-money 50 # 执行命令
QUEUED
127.0.0.1:6379> incrby b-money 50
QUEUED
127.0.0.1:6379> exec # 执行事务
(nil)

线程 Thead2
127.0.0.1:6379> decrby a-money 30  #修改了一个被监视的key
(integer) 70
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值