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>