Redis 分布式锁进阶第七十篇

本篇继续深耕 Redis 分布式锁进阶内容,重点拆解 Redisson 可重入分布式锁的底层设计逻辑,同时结合原理手写一套具备生产可用性的可重入锁实现,覆盖数据结构、Lua 原子脚本、看门狗续期、发布订阅唤醒等核心能力,补齐实战落地要点。

一、Redisson 可重入锁底层设计解析

1. 核心数据结构

Redisson 并没有使用简单的 String 类型实现分布式锁,而是选用Hash结构,这也是它支持可重入的核心基础。

  • 外层 Key:全局唯一的锁名称,用来区分不同业务锁,例如lock:goods:stock。
  • Hash 的 Field:当前持有锁的线程唯一标识,一般由客户端 ID + 线程 ID 拼接而成,精准标记锁的归属。
  • Hash 的 Value:当前线程的锁重入次数,线程首次加锁值为 1,多次重入则持续累加,解锁时逐步递减。

这种结构优势十分明显:既能精准判断锁持有者,避免误删他人锁;又天然支持同一线程反复加锁,完美适配方法嵌套调用的场景;同时只有重入次数归零时,才会真正删除锁 Key,保证解锁逻辑严谨。

2. 看门狗自动续期机制

这是 Redisson 解决业务执行超时导致锁提前释放 的关键机制。 当我们调用无超时时间的lock()方法加锁时,看门狗会自动激活。加锁成功后,框架会启动一个后台定时任务,默认每 10 秒执行一次,主动将锁的过期时间重置为 30 秒。只要业务线程还在运行,锁就会持续续期;一旦业务执行完毕、线程结束,定时任务会随之停止,不再继续续期。 如果手动指定了锁的过期时间,看门狗机制会直接失效,由业务自行把控锁生命周期。

3. 发布订阅阻塞唤醒

常规分布式锁实现中,加锁失败的线程会不断循环自旋尝试加锁,空耗 CPU 资源。Redisson 对此做了优化,引入 Redis 发布订阅模式。 加锁失败的线程不会持续轮询,而是订阅当前锁对应的消息频道,进入阻塞等待状态。当锁持有者执行解锁操作后,会向频道推送锁释放的消息,所有阻塞等待的线程收到通知后,再重新发起锁竞争,大幅降低无效轮询带来的性能损耗。

4. Lua 脚本保证原子性

加锁、重入、解锁等操作都涉及多条 Redis 命令组合,在高并发场景下极易出现竞态问题。Redisson 将整套逻辑封装在Lua 脚本中执行,Redis 会把整个脚本当作一个原子命令执行,中间不会被其他请求打断,从底层规避并发安全问题。

二、可重入锁 Lua 脚本实现

1. 加锁脚本

实现锁创建、线程重入、过期时间设置三大逻辑,全程原子执行。

相关推荐
瑞克-桑切斯36 分钟前
企业生产环境:https部署+nginx高可用(业务不中断)
linux·服务器·数据库
zyseo89 小时前
谷歌SEO 准首页词挖掘脚本:找出排在第 8-20 名的隐藏流量
大数据·数据库·人工智能
xiaogai_gai11 小时前
仅查询策略实战:从金蝶云·星空旗舰版定时拉取收料通知单
大数据·数据库·python
数据工匠老o11 小时前
异构数据库DDL同步:260条链路的结构变更自动适配方案
数据库·架构
这个DBA有点耶12 小时前
银行业市占率最高的国产数据库是谁?先搞清楚“市占率”的四种口径
数据库·程序员·架构
用户62799471826213 小时前
南大通用GBase 8a之基于审计日志的冷温热数据分析
数据库
数据库小学妹13 小时前
数据库运维五级成熟度:监控、备份、高可用怎么串起来
运维·数据库·监控
一个天蝎座的程序猿13 小时前
为了给报表提速,我把金仓KES的列存储折腾了个遍:聊聊KES的技术能力
数据库
飞越未来云城的霓虹飞猪13 小时前
AI 数据库地图:从 PostgreSQL 到向量数据库,一次看懂 AI 时代的数据底座
数据库
不像程序员的程序媛13 小时前
导出mysql数据结构
数据库·mysql