Redisson分布式锁自动续期的原理是啥?

1 个回答

  • 美啦美啦美啦
    不要在赚钱的路上把健康丢了,要在健康的路上顺便把钱赚了。
    Redisson分布式锁的自动续期功能是通过一个称为“看门狗”的定时器实现的。这个定时器在锁被任一Redisson实例持有时激活,定期向Redis发送命令以续延锁的有效期。 1. **锁的获取和看门狗启动**: 当锁被获取时,看门狗定时器会被激活。这是在`lock`方法调用时通过`scheduleExpirationRenewal`方法设置的。 ```java public void lock() { long threadId = Thread.currentThread().getId(); try { lock(-1, null, false); } catch (InterruptedException e) { Thread.currentThread().interrupt(); return; } scheduleExpirationRenewal(threadId); } ``` 2. **续期任务调度**: 看门狗会每隔(lockWatchdogTimeout / 3)即10秒续期一次,使用`renewExpiration`方法实现。这个方法通过调用Redis命令延长锁的过期时间。 ```java private void renewExpiration() { commandExecutor.getConnectionManager().newTimeout(t -> { RFuture<Boolean> future = renewExpirationAsync(threadId); future.onComplete((res, e) -> { if (res) { renewExpiration(); } }); }, internalLockLeaseTime / 3, TimeUnit.MILLISECONDS); } ``` 3. **自动续期的异步执行**: `renewExpirationAsync`方法负责在Redis上执行续期命令,确保锁的过期时间被正确更新。 ```java private RFuture<Boolean> renewExpirationAsync(long threadId) { return commandExecutor.evalWriteAsync(name, LongCodec.INSTANCE, RedisCommands.EVAL_BOOLEAN, "if (redis.call('get', KEYS[1]) == ARGV[1]) then " + "redis.call('pexpire', KEYS[1], ARGV[2]); " + "return 1; " + "else " + "return 0; " + "end", Collections.singletonList(name), Long.toString(threadId), internalLockLeaseTime); } ``` 这个机制确保了锁在被持有期间,如果Redisson客户端仍然活跃,锁会持续被续期,避免在长时间任务执行期间锁意外释放的问题。如果客户端崩溃,定时器将停止,锁将不会被续期,并最终自动释放。这样既保持了锁的有效性,又提供了一定程度的故障恢复。
    编辑于 2024-01-04 12:40 •IP属地 北京
    举报
    评论
    收藏