老师。在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非阻塞的。

所以当时任务启动的时间可以频繁一些,降低这个等待间隔~~更多的时间通过锁的时间来控制。

1
0

慕姐8101175

2020-11-28

同问!

0
0

about_blank

2018-03-23

假如有这样一种情况:超时时间为1个小时,轮询时间为2小时。A一开始拿到了锁,B在2小时候之后来,未能获取锁

超时后锁就自动释放了啊。。


假设AB 是同样的定时任务 同样的业务

在同一集群中

应该同一时刻执行 不存在你说的不同时刻执行

因为 ab 代码应该完全相同 所以你声明的时间也一样

如果AB 是不同的定时任务

应该声明不同的分布式锁 

让两个业务持有不同的锁

0
0

Java企业级电商项目架构 Tomcat集群与Redis分布式

Tomcat集群+Redis分布式+代码重构+源码原理解析

2685 学习 · 947 问题

查看课程