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 保住最终写入边界,并对续约失败和超长临界区告警。
参考资料
- 国内:JavaGuide:分布式锁:采用外部锁只协调并发进入、业务条件仍需独立保护的分析,解释
RLock不自动提供业务恰好一次。 - 国内:JavaGuide:分布式锁实现方案:采用租期、续约与失效风险的解释,说明暂停后的旧执行者仍需隔离。
- 国内:阿里云:基于TairString实现分布式锁:核对加锁随机值、原子校验后释放与续租,避免误操作其他持有者。
- 国内:阿里云:Redis开发运维规范:参考客户端连接与超时容错的运行约束,说明锁续约依赖实际客户端和网络,不能忽略失锁与超长临界区。
- 国外:Redis:Distributed Locks:核对租期和随机持有者值的作用,以及故障切换时互斥保证的边界。
- 国外:Redisson:Locks and synchronizers:核对
RLock持有者、重入、看门狗与显式leaseTime模式。


