老师。在get(lockkey)之后,有没有必要添加加一个lockvalueA==null的判断啊?
来源:13-1 Redis分布式锁原理解析

又是一年秋雨时
2018-03-23
假如有这样一种情况:超时时间为1个小时,轮询时间为2小时。A一开始拿到了锁,B在2小时候之后来,未能获取锁。按图示,需要get(lockkey)。但是在B get(lockkey)前一刻,A完成了业务,将锁释放。那么B此时get(lockkey)就是null。按照判断,为null时是直接结束的。那这2小时的业务,不是就无法处理了吗?
3回答
-
Geely
2018-03-25
你好,同学,about同学说的很对,首先如果是不同的业务,那么隔离各自的分布式锁。
然后继续说你说的这个问题。
你说的这个是非常极端情况下的,所以,其实二期还可以演进的就是分布式锁+自旋锁~~如果为了那个瞬间,在自旋10次,间隔10ms的样子。但是10次之后如果没获取到,还是会有你说的这种情况。非常极端的情况下。所以设置锁的时间要根据业务不断调整。
还有一个就是,如果是在b getlock之前释放,那么这个时候是能拿到锁的,因为redis非阻塞的。
所以当时任务启动的时间可以频繁一些,降低这个等待间隔~~更多的时间通过锁的时间来控制。
10 -
慕姐8101175
2020-11-28
同问!
00 -
about_blank
2018-03-23
假如有这样一种情况:超时时间为1个小时,轮询时间为2小时。A一开始拿到了锁,B在2小时候之后来,未能获取锁
超时后锁就自动释放了啊。。
假设AB 是同样的定时任务 同样的业务
在同一集群中
应该同一时刻执行 不存在你说的不同时刻执行
因为 ab 代码应该完全相同 所以你声明的时间也一样
如果AB 是不同的定时任务
应该声明不同的分布式锁
让两个业务持有不同的锁
00
相似问题