锁失效的时间问题
来源: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
有什么问题吗
042020-07-26 -
鸿鹄yyn
2018-09-18
有什么问题吗
012018-09-18
相似问题
Redis分布式锁过期时间的疑问
回答 3
Redis分布式锁中getSet方法疑问
回答 1
解锁部分可能存在异常
回答 1
如果获得锁的线程网络延迟了会不会有问题
回答 1
redis分布式锁的问题
回答 3