别只怪客户端宕机!还有这些导致 Redis 分布式锁“死锁”的原因 - 公众号

news/2025/11/2 19:04:47/文章来源:https://www.cnblogs.com/JavaEdge/p/19185274

本文已收录在Github,关注我,紧跟本系列专栏文章,咱们下篇再续!

  • 🚀 魔都架构师 | 全网30W技术追随者

  • 🔧 大厂分布式系统/数据中台实战专家

  • 🏆 主导交易系统百万级流量调优 & 车联网平台架构

  • 🧠 AIGC应用开发先行者 | 区块链落地实践者

  • 🌍 以技术驱动创新,我们的征途是改变世界!

  • 👉 实战干货:编程严选网

0 前言

除了“持有锁的进程崩溃、未释放锁”这一经典场景,还会因以下容易被忽视的问题,导致系统进入类似死锁的阻塞状态:

1 客户端本地时钟漂移

若加锁客户端的系统时间被人为或自动回拨,可能导致锁的本地过期时间计算错误,客户端误以为锁已过期而提前续期或释放,其他客户端趁机抢占,造成多客户端同时持有同一把锁,后续释放时又互相覆盖,最终谁都无法正常完成业务,表现得像死锁。

解决方案

启用 NTP 严格同步,或使用 monotonic 时间源;

2 锁续期(看门狗)异常

Redisson“看门狗”机制依赖后台线程周期性地为锁续期。若业务线程因 GC、CPU 调度或网络抖动被长时间挂起,看门狗线程也随之暂停,锁在 Redis 端真正过期;业务恢复后却仍认为锁有效,继续持有,导致后续竞争者无法获取锁,形成阻塞。

解决方案

限制业务逻辑执行时间,设置合理的 watchdog 超时上限。

3 主从切换期间的锁丢失

Redis主从异步复制下:

  • 主节点加锁成功后宕机
  • 从节点升为主但尚未收到该锁的写入

新客户端在新【主节点】上再次加锁成功,两个客户端同时持有同一把锁;当它们都尝试释放锁时,可能互相删除对方的键,造成业务逻辑混乱,后续请求因锁状态不一致而持续等待。

解决方案

启用 Redis 哨兵或集群模式,结合 RedLock 多数派策略。

4 Lua 脚本执行超时

用 Lua 脚本保证“判断-删除”原子性时,若脚本因数据量过大或逻辑复杂执行时间超过 Redis 的 lua-time-limit,Redis 会中断脚本并记录 EVALSHA 失败,但客户端可能未收到失败信号,继续认为锁已释放;其他客户端因键仍存在而无法加锁,系统出现“假死”状态。

解决方案

拆分复杂脚本,缩短执行时间,或改用 pipeline 分批执行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/953742.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CCF CSP-S2 2025 游记

\(\text{Day0}\) 看到了 2024 年的第三题,我一直在复习组合计数 DP。结果,一天就弄懂了两道题。。。 \(\text{Day1}\) 第一件事自然是洛谷签到,中吉,忌出行、摸鱼。 早上八点出发,一早起来大雾,告诉走不了高速,…

CSP-S 2025 总结

114,514,1919810.0.前言 信心十足! 1.正文 不会做原题。 2.总结 我是人类吗?

LangChain v1.0 中间件详解:彻底搞定 AI Agent 上下文控制

用 LangChain 构建 AI Agent 的人应该都遇到过这种情况:测试阶段一切正常,部署到生产环境就开始出各种问题。上下文管理混乱,Agent 的行为变得难以预测,最后不得不写一堆自定义代码来控制信息流向。 这是因为在v1.…

【EF Core】“多对多”关系与跳跃导航

“多对多”关系不像“一对多”那么“单纯”,它内部涉及到“连接实体”(Join Entity)的概念。咱们先放下这个概念不表,来了解一下多对多数据表为什么需要一个“辅助表”来建立关系。 假设有两张表:一张表示学生,一…

DeepSeek-MTP多token预测

多Token预测(Multi-Token Prediction, MTP)是DeepSeek-V3模型的一项核心创新技术,旨在通过一次前向传播预测多个未来词元,从而显著提升模型的训练效率和推理速度,同时增强对上下文的理解能力。该技术原始论文是由…

11.2阅读笔记

《断言式编程》这一章教我如何主动地、有章法地处理程序中的“意外”情况。 ​​1. 断言式编程:明确你的假设​​ “断言式编程”的核心思想是:​​用代码明确地表达你对程序状态的假设,如果假设被违反,就果断地报…

温故知新,英语口语提升计划之Social English - Greeting People

Greeting People Look at some ways to greet people. Do you greet people that you meet for the first time the same way that you greet people you know? What can change? Greeting People You Meet for the …

23432

23432 32423 ‍本文来自博客园,作者:对象存储与RustFS,转载请注明原文链接:https://www.cnblogs.com/rsfs/p/19185241/23432-2fnvqw

关于dp

dddddddddpppppppp发扬多头精神,质疑dp,理解dp,成为dp! 由浅入深 ATcoder Dp 普及~提高的版子记录 LinkA - Frog 1B - Frog 2C - VacationD - Knapsack 1E - Knapsack 2F - LCSG - Longest PathH - Grid 1I - Coin…

Git 协作实战与 Gerrit 评审流程

Git 协作实战与 Gerrit 评审流程Git 协作实战与 Gerrit 评审流程适用场景:公司内网仓库 + Gerrit 评审流程;服务器上 Git 版本较老(无 git switch、git restore)。 示例仓库:/home/aaa/bbb/ccc,远端别名 origin。…

分库分表MyCat 架构迁移 OceanBase | 百丽核心财务系统迁移经验总结与问题汇总

分库分表MyCat 架构迁移 OceanBase | 百丽核心财务系统迁移经验总结与问题汇总百丽时尚集团(以下简称百丽)是中国领先的大型时尚鞋服集团,其核心财务系统刚刚经历了一场“换心脏”手术。 本文详细拆解MyCat 切换 Oc…

算法研究内容算法有关概念

1.1调度问题与投资问题 1. 调度问题问题&建模2. 贪心算法: 加工时间短的先做,加工时间从小到大排序(有反例 根据实际问题使用) 3. 算法设计: 1.问题建模 2.选择什么算法?如何描述这个算法? 3.这个算法是否对所有…

第13天(中等题 滑动窗口)

打卡第十三天 2道中等题一个高效的方法来获取数组中所有不重复的元素。 unordered_set<int> uniqueSet(nums.begin(), nums.end());//获取数组中所有不重复的数字 int k = uniqueSet.size();//不重复数字的个数k…

我重生了,重生到了CSP前——高中物理电学速通

喜报:CSP炸了,然后两天之后学校期中考,我夺回属于我的所有!(?) 电荷和元电荷有新的旅行伙伴加入了: $ \ \ \ \ $ 电荷量(符号 \(\mathit{Q}\) 单位 \(\mathit{C}\) )电量荷是有基本单位的,也就是一个电子所带的电…

列车驶向何处 | CSP-S 2025 #3

整个十月的下半是在来来往往的列车上度过的。从苏州往返上海,北京,南京,每一次的结果好像都并不如意。 这个月第一次踏上列车是上海的数学基础测试,机试,十五道题,只填正整数。进场前的目标是十二个题,后来变成…

为啥slmbuild的cutoff不能设得很大

为啥slmbuild的cutoff不能设得很大在sim_slmbuilder.cpp的CSlmBuilder::AddNGram里:if (fr > cut[nlevel]) {TLeafLevel& v = *(TLeafLevel*)(level[nlevel]);v.push_back(TLeaf(ngram[nlevel - 1], fr)); } e…

团队项目1-团队展示选题-图书管理系统

项目信息-图书管理系统项目 内容所属课程 https://edu.cnblogs.com/campus/gdgy/Class12Grade23ComputerScience作业要求 https://edu.cnblogs.com/campus/gdgy/Class12Grade23ComputerScience/homework/13471作业目标…

第二天,学习部分快捷键位(重点加粗)

快捷键位复制 ctrl+C 粘贴 ctrl+V 全选 ctrl+A 剪切 ctrl+X 撤销 ctrl+Z 保存 ctrl+S 关闭 alt+F4 永久删除 shift+delete 打开命令窗口 win+R 打开任务管理器 ctrl+shift+Esc 切换屏幕 win+Tap

windows terminal 配置文件

{"$help": "https://aka.ms/terminal-documentation","$schema": "https://aka.ms/terminal-profiles-schema","actions": [],"copyFormatting": "…