RedissonRedLock issue
See original GitHub issue你好, 在使用RedissonRedLock发现了一个疑似bug的问题。
首先,redlock的算法中提到:
当且仅当从大多数(这里是3个节点)的Redis节点都取到锁,并且使用的时间小于锁失效时间时,锁才算获取成功。
但是RedissonRedLock实际使用中的行为与上面不一致。 将RedissonRedLockTest中的测试用例testLockSuccess修改为如下:
RLock lock1 = client1.getLock("lock1");
RLock lock2 = client1.getLock("lock2");
RLock lock3 = client2.getLock("lock3");
Thread t1 = new Thread() {
public void run() {
lock1.lock();
}
};
t1.start();
t1.join();
RedissonMultiLock lock = new RedissonRedLock(lock1, lock2, lock3);
assertThat(lock.tryLock(500, 5000, TimeUnit.MILLISECONDS)).isTrue();
lock.unlock();
lock1.delete();
上面代码中的assert只在lock3被锁住的时候能通过,lock1或者lock2被锁住时都assert失败。
这个问题在调用public boolean tryLock()
方法时则不会出现。
查看了源码以后发现,出现上述现象的原因是,在获取已经被锁住的lock1或者lock2时,waitTime与RedLock的waitTime是一样的(代码在RedissonMultiLock)。所以只要lock1或者lock2获取超时,RedLock就获取超时返回false了。
而redlock的算法中提到:
如果服务器端没有在规定时间内响应,客户端应该尽快尝试另外一个Redis实例。
请帮忙看下这个问题该如何解决。谢谢。
参考资料:Redlock算法
Issue Analytics
- State:
- Created 6 years ago
- Comments:8 (4 by maintainers)
Top Results From Across the Web
Exception when use RedissonRedLock + RedissonMultiLock
I'm trying to introduce RedLock algorithm in my project, I have 3 Redis nodes, and I need to lock several keys in each...
Read more >Redis client (Redission) stops working if first node is down in ...
You have to use RedissonRedLock and 3 locks for RedLock algorithm: RLock lock1 = redisson.getLock("lock1"); RLock lock2 = redisson.
Read more >Redisson 分布式锁源码09:RedLock 红锁的故事
后来这个issue 在10 月才回复。 2、RedissonRedLock 被弃用. 是的,没有看错,现在RedissonRedLock 已经被启用了。
Read more >关于redlock/ multilock 的疑问· Issue #I4B4GM - Gitee
... locks=new RLock[rLocks.size()]; int index=0; for (RLock r : rLocks) { locks[index++]=r; } rLock = new RedissonRedLock(locks); break;.
Read more >
Top Related Medium Post
No results found
Top Related StackOverflow Question
No results found
Troubleshoot Live Code
Lightrun enables developers to add logs, metrics and snapshots to live code - no restarts or redeploys required.
Start Free
Top Related Reddit Thread
No results found
Top Related Hackernoon Post
No results found
Top Related Tweet
No results found
Top Related Dev.to Post
No results found
Top Related Hashnode Post
No results found
另外还发现public boolean tryLock(long waitTime, long leaseTime, TimeUnit unit)方法中的194行(代码位置)与redlock算法的原文(下面加粗部分)行为是不一致的。
这里我所指出的bug只在lock1或lock2先加锁,并且在testLockSuccess的184行代码处使用public boolean tryLock(long waitTime, long leaseTime, TimeUnit unit)方法才会出现锁获取不到的情况。直接使用无参数的lock()或者tryLock()方法是不会出现这种现象的。
并且184行处的代码没有assert,无论怎么改,测试用例总是能通过的。