13.Redis 实现乐观锁

zhanglei 2022年07月27日 316次浏览

13.Redis 实现乐观锁

悲观锁

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

乐观锁

很乐观,认为需要加锁的时候再加锁。更新数据的时候判断一下,在此期间是否有别的线程对此数据进行了修改,如果没有,更新成功;如果有,更新失败。

Redis 监控测试

正常执行成功

127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set money 100
QUEUED
127.0.0.1:6379(TX)> set out 0
QUEUED
127.0.0.1:6379(TX)> decrby money 20
QUEUED
127.0.0.1:6379(TX)> incrby out 20
QUEUED
127.0.0.1:6379(TX)> exec
1) OK
2) OK
3) (integer) 80
4) (integer) 20
127.0.0.1:6379> 

测试多线程修改值,使用 watch可以当作 redis 的乐观锁操作!

127.0.0.1:6379> watch money
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set money 100
QUEUED
127.0.0.1:6379(TX)> set out 0
QUEUED
127.0.0.1:6379(TX)> decrby money 20
QUEUED
127.0.0.1:6379(TX)> incrby out 20
QUEUED
127.0.0.1:6379(TX)> exec   # 数据被另外的线程修改,事务失败,自动解锁。
(nil)                      
127.0.0.1:6379> 

# 在以上执行 exec 之前,做如下操作
127.0.0.1:6379> set money 1000
OK
127.0.0.1:6379>