目录
一、Redisson分布式锁的续期
Redisson是一个基于Redis的Java分布式锁实现。它允许多个进程或线程之间安全地共享资源。为了实现这一点,Redisson使用了一种基于分布式系统的锁机制,其中锁的持有者在操作过程中需要维护锁的有效性。
关于Redisson分布式锁的详细介绍,可移步到我的另一篇博客Redisson分布式锁-优快云博客
在Redisson中,锁的续期是一个关键特性,用于确保在锁的持有者仍在执行任务期间,锁不会被意外释放。
整体分析
锁的续期机制在Redisson中是自动管理的,锁的续期是基于一个定时任务的机制,定期检查锁的状态并决定是否需要续期。具体实现为:
private void renewExpiration() {
// 1、首先会从EXPIRATION_RENEWAL_MAP中获取一个值,如果为null说明锁可能已经被释放或过期,因此不需要进行续期,直接返回
ExpirationEntry ee = EXPIRATION_RENEWAL_MAP.get(getEntryName());
if (ee == null) {
return;
}
// 2、基于TimerTask实现一个定时任务,设置internalLockLeaseTime / 3的时长进行一次锁续期,也就是每10s进行一次续期。
Timeout task = commandExecutor.getConnectionManager().newTimeout(new TimerTask() {
@Override
public void run(Timeout timeout) throws Exception {
// 从EXPIRATION_RENEWAL_MAP里获取一个值,检查锁是否被释放
ExpirationEntry ent = EXPIRATION_RENEWAL_MAP.get(getEntryName());
// 如果为null则说明锁也被释放了,不需要续期
if (ent == null) {
return;
}
// 如果不为null,则获取第一个thread(也就是持有锁的线程)
Long threadId = ent.getFirstThreadId();
if (threadId == null) {
return;
}
// 如果threadId 不为null,说明需要续期,它会异步调用renewExpirationAsync(threadId)方法来实现续期
RFuture<Boolean> future = renewExpirationAsync(threadId);
// 处理结果
future.onComplete((res, e) -> {
// 如果有异常
if (e != null) {
log.error("Can't update lock " + getName() + " expiration", e);