RLock#lock(long leaseTime, TimeUnit unit) leasetime 低于执行时间
RLock#lock(long leaseTime, TimeUnit unit) leasetime lower than execution time
代码:
public void lock() {
RLock lock = redissonClient.getLock("lock");
lock.lock(1, TimeUnit.SECONDS); // or use lock.lock()
doSomething();
lock.unlock(); // if necessary
}
如果doSomething()
花费时间超过1s(网络等原因),那么另一个线程可以获得锁,但这会导致一些问题(例如超卖)。如果使用lock.lock()
,当这个客户端离线时,它永远不会解锁锁,其他客户端无法获得锁。如何解决或平衡这个问题?
If use lock.lock(), while this client offline, it will never unlock the lock and others client can not get the lock.
当你使用lock#lock()
时,会在相应的key上设置一个过期时间(默认为30秒,见org.redisson.config.Config#lockWatchdogTimeout
),并且会有一个watchdog
( watchdog其实就是一个定时器任务),它总是负责自动延期(延长对应key的过期时间)。
所以如果你的客户端突然掉线了,那么锁会在一定时间后释放(也就是对应的key过期了因为watchdog
你的客户端也挂了
).所以不用担心使用lock#lock()
.
锁永远不会释放的问题
代码:
public void lock() {
RLock lock = redissonClient.getLock("lock");
lock.lock(1, TimeUnit.SECONDS); // or use lock.lock()
doSomething();
lock.unlock(); // if necessary
}
如果doSomething()
花费时间超过1s(网络等原因),那么另一个线程可以获得锁,但这会导致一些问题(例如超卖)。如果使用lock.lock()
,当这个客户端离线时,它永远不会解锁锁,其他客户端无法获得锁。如何解决或平衡这个问题?
If use lock.lock(), while this client offline, it will never unlock the lock and others client can not get the lock.
当你使用lock#lock()
时,会在相应的key上设置一个过期时间(默认为30秒,见org.redisson.config.Config#lockWatchdogTimeout
),并且会有一个watchdog
( watchdog其实就是一个定时器任务),它总是负责自动延期(延长对应key的过期时间)。
所以如果你的客户端突然掉线了,那么锁会在一定时间后释放(也就是对应的key过期了因为watchdog
你的客户端也挂了
).所以不用担心使用lock#lock()
.