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().

锁永远不会释放的问题