详细分析Redisson分布式锁中的renewExpiration()方法

目录

一、Redisson分布式锁的续期

整体分析

具体步骤和逻辑分析

为什么需要递归调用?

定时任务的生命周期?


一、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);
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水w

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值