锁失效的时间问题

来源:13-8 redis分布式锁

慕粉1433416698

2018-09-18

public boolean lock(String key, String value) {
// 锁不存在时
if (redisTemplate.opsForValue().setIfAbsent(key, value)) {
return true;
}
// 存在:判断锁是否过期
String currentValue = redisTemplate.opsForValue().get(key);
if (!StringUtils.isEmpty(currentValue)
&& Long.parseLong(currentValue) < System.currentTimeMillis()) {
// 锁已过期
// 这里:n个线程走到这里了: 代码会造成一个问题:
// n个线程中第一个getAndSet成功后,获取得了lock,后面的n-1个线程虽然没有获得锁,但确更新了锁的时间!不合理!
//获取上一个锁的时间
String oldValue = redisTemplate.opsForValue().getAndSet(key, value);
if (!StringUtils.isEmpty(oldValue) && oldValue.equalsIgnoreCase(currentValue)) {
return true;
}
}
return false;
}

写回答

2回答

鸿鹄yyn

2018-09-18

有什么问题吗

0
4
路师兄
回复
廖师兄
个人觉得在解锁前重新获取一下系统时间并更新time,然后传入unlock是不是更加准确一些
2020-07-26
共4条回复

鸿鹄yyn

2018-09-18

有什么问题吗

0
1
慕粉1433416698
看我代码中的注释
2018-09-18
共1条回复

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

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

6410 学习 · 5247 问题

查看课程