Redis分布式锁释放锁的疑问

来源:16-2 升级到2.1.1

曲线J

2019-10-31

图片描述

师兄,不知道我上面的理解对不对。lock()是你的逻辑,lock2()是我自己改的。

写回答

4回答

廖师兄

2019-11-04

你的思路我理解,按照这个思路下去,其实是无穷无尽的。

假如我把代码改成这样

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


0
1
曲线J
非常感谢!
2019-11-04
共1条回复

廖师兄

2019-10-31

//img1.sycdn.imooc.com/szimg/5dba8a3009cf43bb07650430.jpg

你理解的不对,如果已经释放了锁,第一个判断就直接返true了

if(redisTemplate.opsForValue().setIfAbsent(key, value)) {
    return true;
}

另外要注意,这里是没有给redis设置过期时间的。

0
2
曲线J
师兄,你标注的那个方框,我判断的是ifAbsent为null(因为是包装类可能为null),返回false。当ifAbsent为false时还是会执行后续的逻辑的。 不知道我前面提到的2个线程的的理解是否正确?
2019-11-01
共2条回复

曲线J

提问者

2019-10-31

//img.mukewang.com/szimg/5dba83d809bd853613340962.jpg

这个和我的逻辑不一样吧,师兄你的逻辑是currentValue为空直接返回false了,而我的lock2方法是返回true,我理解是一个线程完成了操作释放了锁,所以得到的空,这个时候就可以获得锁了。


第二个oldValue你的也是为空直接返回false,而我的是返回true,也是同样的道理,一个线程完成了操作释放了锁,所以得到的空,这个时候就可以获得锁了。






0
0

廖师兄

2019-10-31

你的写法只是把if里的条件拆分了,改成了2个if,运行的结果和我的是是一样的

0
0

Spring Boot双版本(1.5/2.1) 打造企业级微信点餐系统

从0到1开发中小型企业级Java应用,并学会迭代重构技巧

6410 学习 · 5247 问题

查看课程