Redis乐观锁悲观锁

悲观锁

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

乐观锁(监视!Watch,面试常问)

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

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
OK
127.0.0.1:6379> multi
OK
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) (integer) 80
2) (integer) 20
127.0.0.1:6379> 
  • 测试多线程修改值,使用 watch 可以当作redis的乐观锁操作
127.0.0.1:6379> watch money # 监视 money
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> decrby money 10
QUEUED
127.0.0.1:6379(TX)> incrby out 10
QUEUED
127.0.0.1:6379(TX)> exec # 执行之前,另外一个线程,修改了money值,这个时候,就会导致事务执行失败!
(nil)
  • 如果修改失败,获取最新的值即可
127.0.0.1:6379> UNWATCH # 1.如果发现事务执行失败,就先解锁
OK
127.0.0.1:6379> WATCH money # 2.获取最新的值,再次监视,select version
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> DECRBY money 1
QUEUED
127.0.0.1:6379(TX)> incrby money 1
QUEUED
127.0.0.1:6379(TX)> exec # 3.对比监视的值是否发生了变化,如果没有发生变化,那么可以执行成功,如果变化,就执行失败
1) (integer) 79
2) (integer) 80
127.0.0.1:6379> 

你可能感兴趣的:(Redis,redis,缓存,数据库)