Redis宕机时如何确保Radisson分布式锁被释放?AWS场景疑问
关于Radisson分布式锁在Redis宕机时的释放机制及代码优化建议
首先得提下你代码里的一个小问题:你现在的写法里,如果tryLock()没成功获取到锁,finally块里调用lock.unlock()会直接抛出IllegalMonitorStateException——因为当前线程根本没持有这个锁。得先判断锁是否获取成功,再执行解锁逻辑,修正后的代码大概是这样:
@Override @Async public Future<BaseResponse> someMethodAsync(){ Lock lock = redissonClient.getFairLock(getLockName()); boolean isLocked = false; try{ isLocked = lock.tryLock(); if(isLocked){ //执行业务逻辑 return new AsyncResult<>(resp); } }finally{ if(isLocked){ lock.unlock(); } } }
接下来回到你关心的核心问题:当AWS环境下的Redis宕机时,锁的释放机制:
- 自带自动过期+看门狗兜底:Radisson的分布式锁默认就有看门狗(Watch Dog) 机制。如果你调用
tryLock()时不指定超时时间,Radisson会自动给锁设置一个默认30秒的过期时间,同时后台会启动一个守护线程,每隔10秒(也就是过期时间的1/3)给持有锁的线程续期——只要你的业务线程还在正常运行,锁就会一直保持有效。 - Redis宕机后的锁释放逻辑:如果Redis节点(不管是单点还是AWS ElastiCache的集群节点)突然挂了,看门狗线程没法和Redis通信,自然没法继续续期。等锁的剩余过期时间耗尽后,锁就会自动从Redis中被清理掉(哪怕之后Redis恢复,过期的锁也不存在了),其他线程就能正常获取锁了。
- 集群场景的额外提醒:如果你的AWS Redis是主从架构或者集群模式,主节点宕机切换到从节点时,可能存在短暂的锁不一致(比如主节点没来得及把锁同步到从节点就挂了)。这种情况可以考虑用Radisson的RedLock(红锁) 机制,同时在多个独立Redis节点上获取锁,进一步提升锁的可靠性。
总结来说:Redis宕机后,只要锁的过期时间到了就会自动释放;正常运行时看门狗会帮你续期,避免业务还没执行完锁就过期。记得先把代码里的解锁逻辑修正下,避免无锁解锁的异常。
内容的提问来源于stack exchange,提问作者John Aladin
相关产品推荐
相关产品推荐

