当前位置: 首页 > news >正文

redis红锁

一、为什么需要 Redlock?

背景问题:

在实际生产环境中,单个 Redis 实例可能存在以下风险:

风险说明
单点故障(SPOF)Redis 宕机会导致锁失效
主从复制延迟使用哨兵或集群,主从之间同步是异步的,可能导致锁误删
网络分区问题节点彼此之间通信中断,客户端可能和不同 Redis 发生交互,导致锁争抢错误

所以问题是:

如何在多 Redis 节点中安全地加锁,同时避免网络和节点不一致导致的锁“幻觉”

于是 Redis 作者 antirez(Salvatore Sanfilippo)提出了 Redlock 算法。


二、Redlock 的设计目标

保证即使在 Redis 节点部分失效、网络延迟等问题下,也能安全地获得分布式锁,并确保“只有一个客户端获得锁”。


三、Redlock 的核心思想

Redlock 使用多个相互独立的 Redis 实例(建议 5 个),算法流程如下:

✅ 加锁流程(五步):

  1. 获取当前时间戳 T1(毫秒)

  2. 使用相同的 keyvalue多个 Redis 节点顺序执行加锁操作,命令:

    SET lock_key value NX PX 30000
    
  3. 尝试在 大多数节点 上加锁成功(比如 5 个节点中 ≥3 个成功)

  4. 计算总耗时 T2 - T1,必须小于锁的过期时间(比如 30000ms)

  5. 若满足以上条件,则加锁成功,否则失败并回滚(解掉已经加上的锁)

✅ 只有同时满足“多数节点成功 + 时间窗口有效”,才认为锁真正成功。


四、Redlock 加锁成功的示意图

Client A             Redis-1    Redis-2    Redis-3    Redis-4    Redis-5|-----------------> SET NX PX (成功)|-----------------------------> SET NX PX (成功)|-------------------------------------> SET NX PX (失败)|-------------------------> SET NX PX (成功)|-----------------------------------------------> SET NX PX (成功)✅ 成功节点 = 4 >= 3
⏱ 加锁耗时 = 30ms < 30000ms🔐=> 加锁成功!

五、Redlock 的释放锁逻辑

与单节点 Redis 锁相同,必须使用 Lua 脚本确保只删除自己的锁,否则可能删错别人设置的锁。

客户端应在每个实例上执行以下逻辑:

if redis.call("get", KEYS[1]) == ARGV[1] thenreturn redis.call("del", KEYS[1])
elsereturn 0
end

六、Redlock 的优点

优点说明
高容错允许部分 Redis 节点故障
避免主从延迟风险不依赖某个主节点,多个节点投票机制更健壮
强一致性更近一步多节点协调提升了锁的可靠性
官方推荐方案来自 Redis 原作者,适合追求安全性的分布式场景

七、Redlock 的缺点 & 争议点

虽然 Redlock 设计理念优秀,但在业界也有一定争议:

  1. 复杂性高:需要多个 Redis 实例维护、同步、多点操作、时钟精度问题

  2. 实际并不绝对安全:在极端网络分区场景下仍可能导致脑裂

  3. Redisson 中实现的是“改良版”:引入了“看门狗”机制自动续约

参考论文:《How to do distributed locking》(Martin Kleppmann)


八、Redlock 实践建议

  • 使用 Redis 5 个独立节点(物理或逻辑隔离)

  • 设置合理过期时间(避免锁误释放)

  • 使用 UUID 作为锁值,防止误删他人锁

  • 使用 Lua 脚本释放锁

  • 可以使用 Redisson 作为客户端库,它对 Redlock 做了良好封装


九、Redlock vs 普通 Redis 分布式锁对比

项目单节点 Redis 锁Redlock
节点数量1≥ 3(推荐5)
可用性容易单点故障容错性强
一致性较弱(主从问题)更强
复杂性简单较高
实现方式SET NX PX多节点投票、时间窗口

十、总结一句话

Redlock 是一种提升 Redis 分布式锁一致性和容错性的算法,通过多个独立 Redis 实例投票确认,降低因单节点故障或主从延迟带来的锁安全隐患。


文章转载自:
http://aphlogistic.alwpc.cn
http://attendant.alwpc.cn
http://alcoholization.alwpc.cn
http://cassia.alwpc.cn
http://behavioral.alwpc.cn
http://adas.alwpc.cn
http://blood.alwpc.cn
http://alegar.alwpc.cn
http://biodynamics.alwpc.cn
http://bicorne.alwpc.cn
http://anoxemic.alwpc.cn
http://bushland.alwpc.cn
http://biogeocenose.alwpc.cn
http://chiropody.alwpc.cn
http://bingo.alwpc.cn
http://caveator.alwpc.cn
http://caplin.alwpc.cn
http://autobiography.alwpc.cn
http://abaxial.alwpc.cn
http://cashmerette.alwpc.cn
http://camelot.alwpc.cn
http://chowmatistic.alwpc.cn
http://cabotine.alwpc.cn
http://cetological.alwpc.cn
http://bookman.alwpc.cn
http://antagonistical.alwpc.cn
http://botany.alwpc.cn
http://aspergillosis.alwpc.cn
http://amsterdam.alwpc.cn
http://aeriality.alwpc.cn
http://www.dtcms.com/a/281246.html

相关文章:

  • GitHub 上 Star 数量前 8 的开源 Web 应用项目
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘pandas’问题
  • centos8集群部署etcd
  • 【12】MFC入门到精通——MFC 消息对话框 MessageBox()和AfxMessageBox() 解析 示例 及 应用实例
  • 【目标追踪】MUTR3D: A Multi-camera Tracking Framework via 3D-to-2D Queries
  • MongoDB数据问题说明
  • css-css执行的三种方式和css选择器
  • AS32X601 系列 MCU 硬件最小系统设计与调试方案探析
  • Agentic AI 的威胁与缓解措施
  • 如何快速有效地在WordPress中添加Instagram动态
  • 【PTA数据结构 | C语言版】前序遍历二叉树
  • 零基础入门物联网-远程门禁开关:代码调试
  • 过滤数组中null、undefined、‘‘、等非真内容
  • AAAI-2025 | 同济大学面向嘈杂环境的音频视觉导航!BeDAViN:大规模音频-视觉数据集与多声源架构研究
  • OpenCSG QA:您的国产大模型与 Agent 管理平台
  • 变更缓冲池简介
  • 19.1 单元测试框架
  • ssm学习笔记day08mybatis
  • ESP32轻松实现UDP无线通信
  • 使用python的pillow模块将图片转化为灰度图,获取值和修改值
  • 雷军的 IP 革命:人格化力量如何重塑商业规则|创客匠人
  • uniapp微信小程序弹窗
  • 《汇编语言:基于X86处理器》第8章 高级过程(1)
  • 被人工智能激活的哲学
  • 短剧小程序的「技术革命」:从「粗放生长」到「精准运营」
  • Windows内核对象
  • 新方法!家长可用安卓或苹果,远程管理孩子使用iPhone的时长
  • LeetCode|Day12|58. 最后一个单词的长度|Python刷题笔记
  • 跨平台游戏引擎 Axmol-2.7.1 发布
  • C#中Static关键字解析