Redisson 分布式锁如何工作,如何处理续期与失效?

考查重点:锁持有者、看门狗与失效。Redisson用持有者标识与原子脚本管理锁,特定模式可由看门狗续期;按实际版本和租期配置解释续期何时停止及失效后写入风险

本题目录

参考答案

核心回答

Redisson RLock 把锁状态放在 Redis,通过原子脚本检查持有者、记录重入次数并设置租期;持有者通常由客户端标识与线程标识共同确定。同一持有者可重入,其他持有者等待或获取失败,释放也只能由合法持有者执行。

续期分两种模式:不指定显式租期时,常用加锁方式由看门狗延长过期时间;指定 leaseTime 时按这个租期管理,不应再依赖看门狗自动续约。锁到期或客户端崩溃后最终可释放,但业务代码不会被 Redis 自动终止。

加锁、等待与释放

常见的 RLock 实现用哈希字段保存持有者及重入次数。脚本把“键是否存在、自己是否持有、增加计数、设置过期”作为一组原子操作。竞争失败后结合剩余租期和发布订阅通知安排等待,而不是不断无间隔查询。

解锁时校验持有者,重入计数尚未归零就保留锁;归零后删除锁并通知等待者。误用其他线程解锁会违反 RLock 的持有者约束。异步或响应式代码尤其要说明操作使用的线程标识,不能随意跨线程拼接同步锁调用。

看门狗与固定租期

当前参考文档的默认 lockWatchdogTimeout 为三十秒。看门狗续约任务在租约到期前运行,成功后延长租期;释放锁、客户端关闭、持有者失效或续约失败会影响后续续期。具体续期批处理、调度间隔与重试配置应按实际依赖版本核对,不把一个源码版本中的常量说成协议保证。

RLock lock = redisson.getLock("lock:order:42");
lock.lock(); // 常用的看门狗模式
try {
    // 在业务侧完成状态检查、写入与幂等约束
} finally {
    lock.unlock();
}
// lock.lock(10, TimeUnit.SECONDS) 是另一种显式租期模式。

锁失效以后为什么还可能写错

客户端长暂停或网络异常时,锁可能到期,新客户端获取锁;旧客户端恢复后仍可能提交写入。普通 RLock 不是资源端的隔离令牌,也不自动提供业务恰好一次。主从切换时的复制时序同样需要评估。

高一致性场景用数据库条件更新、唯一约束或下游实际校验的 fencing token 保住最终写入边界,并对续约失败和超长临界区告警。

参考资料

相关面经

8 篇

多益网络

软件开发工程师
一面
查看原面经 →
刚才提到的分布式锁,讲一下其中的看门狗机制。

猎聘

AI 应用开发工程师
查看原面经 →
Q17. 分布式锁怎么处理重入、续期和释放?

美的

后端开发工程师
秋招一面
查看原面经 →
看门狗机制的原理

知乎

后端开发
实习一面
查看原面经 →
项目问的多,具体不说了,比如lua、设计思路、逻辑、你怎么设计的, 具体的逻辑,比如lua里面的有哪些逻辑 你用Lua实现分布式锁,为什么不用Redisson的RLock?

网易云音乐

后端开发
实习一面
查看原面经 →
实际项目中有没有用过分布式锁?详细讲讲Redisson底层原理
展开剩余 3 篇面经

知乎

后端开发工程师(研发运营)
实习一面
查看原面经 →
实际项目中有没有用过分布式锁?详细讲讲Redisson底层原理(看门狗机制、RedLock等)。

高德

Agent 后端开发
日常实习一面
查看原面经 →
k. Redisson实现分布式锁的原理和场景

阿里巴巴

后端开发工程师(Agent)
实习一面
查看原面经 →
Redis 分布式锁(Redisson)实现原理?如何避免死锁?

收录题集

1 个来源,共1 份题集

相关题目

4 题