Redisson RLock租约时长小于执行时间及离线死锁问题如何解决
Redisson 锁租期冲突问题解决方案
两个问题的核心矛盾是固定租期无法适配业务执行时长波动、无固定租期容易因客户端离线造成死锁,可通过Redisson自带机制结合规范写法解决:
- 优先使用无参
lock()方法,依赖内置看门狗机制
无参lock()默认开启看门狗能力,锁初始租期为30秒(可通过lockWatchdogTimeout参数自定义),只要持有锁的客户端正常存活,后台会每10秒自动将锁的租期重新续为30秒,完全不用担心业务执行超时导致锁提前释放。如果客户端意外离线,看门狗进程也会随之终止,不会再发起续期请求,锁到期后会自动释放,不会出现永久死锁问题。 - 严格遵循锁操作规范
解锁逻辑必须放在finally代码块中,同时要先判断当前线程是否持有锁,避免业务抛出异常时锁无法释放,或是误解锁其他线程持有的锁抛出异常,正确写法示例:public void correctLock() { RLock lock = redissonClient.getLock("business_lock"); lock.lock(); try { // 业务逻辑 doSomething(); } finally { if (lock.isHeldByCurrentThread()) { lock.unlock(); } } } - 需指定租期场景的兼容处理
如果业务确实需要强制控制锁的最长持有时间,要将leaseTime设置为业务最大预估执行时长的3~5倍,留出足够冗余空间,避免正常业务未执行完锁就被释放。同时可在业务逻辑中增加幂等校验,比如操作前校验资源状态、新增数据库乐观锁,即使极端情况下锁被提前释放,也不会出现超卖、重复执行等问题。
内容的提问来源于stack exchange,提问作者xmcx
相关产品推荐
相关产品推荐

