Redis(十三):Redis实现乐观锁

2022-12-01 08:45:50 浏览数 (1)

1、悲观锁与乐观锁

乐观锁和悲观锁是一种程序设计思想,而不是具体的代码。乐观锁和悲观锁应用的场景有很多,在数据库和多线程等等都会用到。

  • 悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程)。
  • 乐观锁:总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据。

2、Redis监视测试

正常情况,执行成功:

代码语言:javascript复制
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 20
QUEUED
127.0.0.1:6379> INCRBY out 20
QUEUED
127.0.0.1:6379> EXEC
1) (integer) 80
2) (integer) 20

测试多线程修改只,使用watch当作Redis的乐观锁操作:

代码语言:javascript复制
127.0.0.1:6379> watch money	//监视money对象
OK
127.0.0.1:6379> multi		
OK
127.0.0.1:6379> DECRBY money 20
QUEUED
127.0.0.1:6379> INCRBY out 20
QUEUED
127.0.0.1:6379> EXEC	//执行之前,另一个线程修改了我们的值,这时候就会导致执行失败!
(nil)
127.0.0.1:6379> unwatch money	//先解锁
OK
127.0.0.1:6379> watch money		//再次放置锁,再次见识money最新值
OK
127.0.0.1:6379> multi		
OK
127.0.0.1:6379> DECRBY money 20
QUEUED
127.0.0.1:6379> INCRBY out 20
QUEUED
127.0.0.1:6379> EXEC

0 人点赞