Redis分布式锁中getSet方法疑问
来源:13-8 redis分布式锁
揍猫的老鼠
2018-04-10
Redis分布式锁中,当锁过期的时候,如果多个客户端同时执行getSet()方法,那么虽然最终只有一个线程可以加锁,但是这个线程的锁的过期时间可能被其线程覆盖。
比如key的时间是10000,线程A的过期时间是10010,线程B的过期时间是10020。当线程A执行了getSet方法拿到了锁,那么key里面的值为10010,然后线程B也去抢锁,执行getSet方法,虽然返回的值是10010,与B线程的锁的过期时间不等,B拿不到锁,但是,此时key的值被线程B改为10020了。 这个情况怎么办?
写回答
1回答
-
廖师兄
2018-04-10
"比如key的时间是10000,线程A的过期时间是10010" ,不太明白你的意思,可否直接拿课程中redis锁的代码来说明呢
-------更新----------
但此时key的value变成了10020, 但是返回的是10010。 你看看这边文章前面部分的文字说明 https://blog.csdn.net/abbc7758521/article/details/77990048 , 结合我给的代码(下方)
/** * 加锁 * @param key * @param value 当前时间+超时时间 * @return */ public boolean lock(String key, String value) { if(redisTemplate.opsForValue().setIfAbsent(key, value)) { return true; } //currentValue=A 这两个线程的value都是B 其中一个线程拿到锁 String currentValue = redisTemplate.opsForValue().get(key); //如果锁过期 if (!StringUtils.isEmpty(currentValue) && Long.parseLong(currentValue) < System.currentTimeMillis()) { //获取上一个锁的时间 String oldValue = redisTemplate.opsForValue().getAndSet(key, value); if (!StringUtils.isEmpty(oldValue) && oldValue.equals(currentValue)) { return true; } } return false; }
052018-08-22
相似问题
redis分布式锁的疑问:
回答 1
Redis分布式锁过期时间的疑问
回答 3
redis分布式锁疑问
回答 2
Redis分布式锁释放锁的疑问
回答 4
使用分布式锁是不是变量要定义到redis
回答 2