Redis12乐观锁


悲观锁:

很悲观,认为什么时候都会出现问题,无论做什么都会加锁(程序性能会极其低下)

乐观锁:

很乐观,认为什么时候都不会出现问题,无论做什么都不加锁

获取version

更新的时候比较version

redis监视测试(面试常问)

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

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 10
QUEUED
127.0.0.1:6379> INCRBY out 10
QUEUED
127.0.0.1:6379> EXEC (如果还未执行EXEC 的时候,这个时候来了一个线程插队把money的值一修改,修改为1700,那么当前这个事务就会提交失败)
(nil)
127.0.0.1:6379> get money
"1700"

127.0.0.1:6379> UNWATCH (如果事务执行失败,就先解锁 放弃监视)
OK
127.0.0.1:6379> WATCH money (获取最新的值,再次监视,select version)
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> INCRBY money -10
QUEUED
127.0.0.1:6379> INCRBY money 100
QUEUED
127.0.0.1:6379> EXEC  (比对监视的值是否发生变化,如果没有变化,那么执行成功)
1) (integer) 1700
2) (integer) 1800