Redis分布式锁释放锁的疑问
来源:16-2 升级到2.1.1
曲线J
2019-10-31
师兄,不知道我上面的理解对不对。lock()是你的逻辑,lock2()是我自己改的。
写回答
4回答
-
你的思路我理解,按照这个思路下去,其实是无穷无尽的。
假如我把代码改成这样
public boolean lock(String key, String value) { String currentValue = redisTemplate.opsForValue().get(key); if (StringUtils.isEmpty(currentValue)) { return true; }
是不是发现不要setIfAbsent的判断也可以。
if(redisTemplate.opsForValue().setIfAbsent(key, value)) { return true; }
总的说来,课程里写法还无法百分之百保证锁。我看你非常感兴趣,你可以看看这篇文章https://mp.weixin.qq.com/s/JTsJCDuasgIJ0j95K8Ay8w
另外,我推荐使用 https://github.com/redisson/redisson/tree/master/redisson-spring-boot-starter
012019-11-04 -
廖师兄
2019-10-31
你理解的不对,如果已经释放了锁,第一个判断就直接返true了
if(redisTemplate.opsForValue().setIfAbsent(key, value)) { return true; }
另外要注意,这里是没有给redis设置过期时间的。
022019-11-01 -
曲线J
提问者
2019-10-31
这个和我的逻辑不一样吧,师兄你的逻辑是currentValue为空直接返回false了,而我的lock2方法是返回true,我理解是一个线程完成了操作释放了锁,所以得到的空,这个时候就可以获得锁了。
第二个oldValue你的也是为空直接返回false,而我的是返回true,也是同样的道理,一个线程完成了操作释放了锁,所以得到的空,这个时候就可以获得锁了。
00 -
廖师兄
2019-10-31
你的写法只是把if里的条件拆分了,改成了2个if,运行的结果和我的是是一样的
00
相似问题