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

Redis 分布式锁的五大深坑与实战解法

在单体架构时代遇到并发问题我们直接上 synchronized 或者 ReentrantLock 就能轻松搞定。但一到微服务、分布式时代这些本地锁就集体罢工了。这时候我们通常会请出 Redis 来救场实现分布式锁。很多人拍脑袋一想Redis 做分布式锁还不简单用 SETNXSet if Not eXists不就行了抢到返回 1没抢到返回 0。但如果你在生产环境真敢这么写马上就会被现实教做人。Redis 分布式锁其实是一路升级打怪的过程里面藏着无数个深坑。今天咱们就用大白话把实现 Redis 分布式锁会遇到的坑以及怎么填坑挨个捋一遍。第一个坑服务宕机死锁诞生了场景线程 A 用 SETNX 抢到了锁开开心心去执行业务代码。结果刚执行到一半这台服务器突然停电宕机了。问题锁还在 Redis 里但原本要释放锁的线程 A 已经“阵亡”了。这把锁永远没人去释放DEL 操作没执行其他服务器上的线程再也抢不到锁整个业务彻底卡死。这就是最经典的死锁。怎么解加一个过期时间TTL。就算服务器挂了只要时间一到Redis 自动把锁清理掉其他线程就能重新抢锁了。第二个坑加锁和设置过期时间不是原子操作场景既然要加过期时间那我就写两行代码呗SETNX lock_key 1 加锁EXPIRE lock_key 10 设置 10 秒过期问题这依然有死锁的风险。万一第一步 SETNX 刚执行完还没来得及执行第二步 EXPIRE服务器就宕机了呢这两步操作不是原子的要么都成功要么都失败中间是可以被打断的。怎么解在 Redis 2.6.12 版本之后官方提供了一个原子的命令把这两个操作合二为一了SET lock_key 1 NX PX 10000这句话的意思是如果 key 不存在就设置NX并且设置 10000 毫秒的过期时间PX一气呵成。第三个坑不小心释放了别人的锁场景现在我们用了原子操作也有了过期时间看起来很完美了对吧看看下面这个流程线程 A 抢到了锁过期时间是 10 秒。线程 A 的业务太复杂或者遇到了网络卡顿执行了 15 秒还没完。第 10 秒的时候Redis 发现锁过期了自动释放了。此时线程 B 跑过来顺利抢到了锁开始执行业务。第 15 秒线程 A 终于执行完了它顺手执行了一句 DEL lock_key 来释放锁。问题线程 A 把线程 B 正在用的锁给删了然后线程 C 又能抢到锁并发彻底乱套了。怎么解解铃还须系铃人谁加的锁只能谁来解。加锁的时候不要随便存个 1而是存一个唯一的标识比如 UUID 或者当前线程的 ID。SET lock_key 唯一标识 NX PX 10000释放锁的时候先查一下这个 key 的值是不是自己的唯一标识。如果是才执行删除。注意“判断是不是自己”和“删除”又是两步操作为了保证原子性这里必须使用Lua 脚本交给 Redis 执行。第四个坑锁到期了但业务还没执行完场景这就紧接着刚才的第三个坑。虽然我们通过唯一标识防止了“误删别人的锁”但核心问题没解决啊线程 A 的业务没执行完锁就被 Redis 提前回收了导致 A 和 B 同时在跑业务这还叫什么锁有人说“那我把过期时间设置长一点设成 1 分钟、1 小时不行吗”不行。万一服务器真挂了别的线程得干等 1 小时才能接盘系统性能直接扑街。怎么解这就需要引入大名鼎鼎的**“看门狗Watch Dog”机制**了。这事儿不用自己写代码直接上工业级开源框架Redisson。它的原理是假设设置锁默认过期时间为 30 秒。当你抢到锁之后Redisson 会在后台偷偷开启一个线程看门狗每隔 10 秒过期时间的 1/3去检查一下“兄弟你业务干完了没没干完的话我帮你跟 Redis 说一声把过期时间重新续回到 30 秒。”这样一来只要你的业务没执行完锁就不会失效如果你的服务器宕机了看门狗也跟着死了没人续期锁到期自然释放。堪称完美第五个坑Redis 主从切换导致锁丢失场景稍微大一点的公司Redis 肯定不是单机而是“主从集群”一主多从。线程 A 在主节点Master抢到了锁。Master 还没来得及把这把锁的数据同步给从节点SlaveMaster 突然死机了。哨兵机制发现 Master 死了赶紧把其中一个 Slave 提拔成新的 Master。这个新的 Master 上压根没有线程 A 的锁数据线程 B 跑来一抢成功获取了锁。并发安全再次崩溃。怎么解为了解决这个问题Redis 的作者提出了Redlock红锁算法。大致原理是搞 5 个相互独立的 Redis Master 节点。线程来抢锁的时候必须在过半的节点比如 3 个以上都加锁成功才算真正抢到了锁。就算挂掉一两个节点也不会影响整体的正确性。但说句实在话实际生产中很少人用 Redlock。为什么因为太重了性能极差而且搭建和维护成本太高。业界的普遍共识是如果你追求绝对的强一致性比如金融级资金转账一分钱都不能差那请你放弃 Redis 锁直接去用Zookeeper做分布式锁ZK 从底层机制上就保证了数据的强一致性。如果是普通的电商秒杀、积分扣减等日常业务直接用Redisson的单机锁或集群锁就足够了极小概率的主从切换丢锁问题靠数据库层面的乐观锁兜底或者人工对账补偿即可没必要为了 0.01% 的概率牺牲 99.99% 的性能。总结抄作业时间看了这么多坑是不是觉得手写 Redis 分布式锁简直是个灾难没关系前人栽树后人乘凉我们只需要记住最终的实战结论绝对不要自己用 SETNX 去手写分布式锁的逻辑坑太多你填不过来。日常 Java 开发直接引入Redisson框架。使用 Redisson 的 RLock它自带了Lua脚本防误删、看门狗自动续期、甚至还支持可重入锁。一行代码搞定RLock lock redisson.getLock(myLock); lock.lock(); try { // 执行业务逻辑 } finally { lock.unlock(); // 别忘了放在 finally 里释放 }如果面试官问你原理把上面说的死锁、误删、原子性、看门狗、主从丢失这 5 个坑挨个讲给他听保准他频频点头直接发 Offer。

相关文章:

Redis 分布式锁的五大深坑与实战解法

在单体架构时代,遇到并发问题,我们直接上 synchronized 或者 ReentrantLock 就能轻松搞定。但一到微服务、分布式时代,这些本地锁就集体罢工了。这时候,我们通常会请出 Redis 来救场,实现分布式锁。很多人拍脑袋一想&a…...

OLLMA部署本地大模型轻量化标杆:LFM2.5-1.2B-Thinking边缘AI落地全景图

OLLMA部署本地大模型轻量化标杆:LFM2.5-1.2B-Thinking边缘AI落地全景图 1. 引言:当大模型“瘦身”成功,走进你的口袋 你是否曾想过,让一个功能强大的AI助手常驻在你的个人电脑、笔记本,甚至是手机里,随时…...

达梦数据库日志避坑指南:遇到‘Fail to find file‘等FATAL错误时必做的3步抢救流程

达梦数据库FATAL级故障应急手册:从日志分析到数据抢救的完整路径 当数据库控制台突然弹出鲜红的"FATAL"字样时,任何DBA的肾上腺素都会飙升。不同于普通的ERROR告警,FATAL错误往往意味着数据库服务已经或即将停止工作。去年某电商大…...

ESP8266 AT指令透传开发实战:MCU+WiFi模组协同设计指南

1. 项目概述本项目聚焦于ESP8266 WiFi通信模组的底层通信验证与典型物联网功能实现,核心目标是建立一套可复现、可扩展的AT指令调试与网络数据交互验证流程。区别于SDK二次开发模式,本方案采用MCUESP8266的经典分立架构,将ESP8266严格定位为透…...

详解Java包装类

一、什么是包装类?核心作用是什么?包装类,本质上是Java为8种基本数据类型分别提供的“封装类”,它将基本数据类型的值封装成对象,赋予其对象的特性(可以调用方法、实现接口、作为泛型参数等)。每…...

从TSP到CVRP:用经典聚类+量子路由破解物流容量限制难题

量子计算与经典算法融合:破解物流路径优化中的容量约束挑战 当物流企业面对每天数千个配送点的路径规划时,传统算法往往在计算时间和解决方案质量之间陷入两难。这种被称为"容量约束车辆路径问题"(CVRP)的挑战,已经成为制约现代物流…...

OpenClaw云端体验:通过星图平台快速部署Qwen3-32B镜像

OpenClaw云端体验:通过星图平台快速部署Qwen3-32B镜像 1. 为什么选择云端体验OpenClaw 作为一个长期关注AI自动化工具的技术爱好者,我第一次接触OpenClaw时就被它的理念吸引了——一个能在本地电脑上像人类一样操作鼠标键盘、读写文件的AI智能体。但当…...

LumiPixel Canvas Quest生成速度优化实践:提升批量处理效率

LumiPixel Canvas Quest生成速度优化实践:提升批量处理效率 1. 为什么需要关注生成速度? 当你第一次使用LumiPixel Canvas Quest进行批量图片生成时,可能会遇到这样的场景:需要处理100张产品展示图,但生成速度慢得让…...

深入浅出:FOC算法中的电流采样,单电阻、双电阻、三电阻方案到底怎么选?(附MATLAB仿真对比)

深入浅出:FOC算法中的电流采样方案实战选型指南 当你在深夜调试一块新设计的FOC驱动板时,示波器上那些扭曲的电流波形是否曾让你抓狂?作为一位经历过数十个电机控制项目的工程师,我清楚地记得第一次面对单电阻采样方案时&#xff…...

LongCat动物百变秀参数详解:Steps和Guidance Scale怎么调效果最好

LongCat动物百变秀参数详解:Steps和Guidance Scale怎么调效果最好 你有没有遇到过这样的情况:用LongCat动物百变秀给自家猫咪“变装”,输入了“给猫戴上墨镜”,结果生成的图片要么墨镜位置奇怪,要么猫脸都变形了&…...

Qwen3-TTS-12Hz-1.7B-VoiceDesign效果展示:10种语言多音色生成实例

Qwen3-TTS-12Hz-1.7B-VoiceDesign效果展示:10种语言多音色生成实例 1. 开场白:语音生成的新高度 最近试用了Qwen3-TTS-12Hz-1.7B-VoiceDesign这个语音生成模型,说实话效果确实让人眼前一亮。不需要任何录音样本,只用文字描述就能…...

零密码SCP文件传输:手把手教你配置SSH密钥对(含最新权限设置技巧)

零密码SCP文件传输:SSH密钥对配置与权限优化实战 每次传输文件都要反复输入密码?服务器运维工作中频繁的文件交互是否让你感到效率低下?SSH密钥对技术正是解决这一痛点的利器。作为安全工程师日常必备技能,正确配置密钥对不仅能实…...

AMQP-CPP实战:构建高性能C++异步消息处理系统

1. AMQP-CPP与RabbitMQ的黄金组合 RabbitMQ作为企业级消息队列的标杆,其核心价值在于实现服务间的异步解耦。而AMQP-CPP就像是为C开发者量身定制的"专属司机",它能以最高效的方式将你的应用与RabbitMQ连接起来。不同于其他语言客户端库的臃肿&…...

不止于隔离:用HCL模拟器玩转VLAN间通信与端口隔离的混合安全策略

企业网络中的VLAN与端口隔离混合安全策略实战 在当今复杂的网络环境中,仅依靠单一的安全措施往往难以满足企业对网络隔离与通信的双重需求。VLAN技术提供了逻辑上的网络划分,而端口隔离则能在物理端口层面实现更精细的访问控制。本文将深入探讨如何通过H…...

Vue项目Moment.js引入优化:全局挂载与按需引入的深度解析与最佳实践

在Vue开发中,如何正确引入Moment.js是优化项目性能的关键。本文将详细对比全局挂载和局部按需引入的优劣,探讨Tree Shaking机制在局部引入中的作用。我们推荐优先采用局部按需引入以减少打包体积,并提供通过插件形式优化全局挂载的方案&#…...

电源完整性(PI)设计全攻略:从PDN噪声到EMI的完整解决方案

电源完整性设计实战指南:从噪声抑制到系统级优化的全流程方案 在高速数字电路设计中,电源完整性(PI)问题正成为制约系统性能的隐形杀手。当处理器时钟频率突破GHz级别,电源分配网络(PDN)中微伏级的噪声就可能导致逻辑错误;当数据速…...

PaddleOCR与Python3.8.5在Windows环境下的快速安装与实战调试指南

1. 环境准备:Python与PaddleOCR的完美组合 如果你正在寻找一个简单高效的OCR解决方案,PaddleOCR绝对值得一试。作为百度开源的OCR工具库,它支持多种语言的文本检测和识别,而且对中文场景特别友好。我最近在Windows 10上使用Python…...

Qwen3.5-35B-A3B-AWQ-4bit效果深度展示:3D渲染图材质识别+光影分析报告

Qwen3.5-35B-A3B-AWQ-4bit效果深度展示:3D渲染图材质识别光影分析报告 1. 模型能力概览 Qwen3.5-35B-A3B-AWQ-4bit是一款专为视觉理解优化的多模态AI模型,经过4bit量化处理后,能够在双卡GPU环境下高效运行。该模型最突出的能力在于对复杂视…...

网络分层概念

...

PureRef 2.1.0 中文一键安装版 详细教程 设计师必备参考图管理神器

对于概念设计师、插画师、3D建模师以及自媒体创作者来说,参考图的整理效率直接影响创作节奏——你是否也曾遇到过这些痛点?几十张参考图散落在文件夹,切换查找浪费大量时间;调整图片大小、对齐排版反复操作,频繁打断创…...

UE5项目资产命名规范与目录结构最佳实践

1. 为什么需要规范的资产命名与目录结构 刚开始接触UE5开发时,我也犯过很多新手常犯的错误——随手创建文件夹、随意命名资源。结果项目做到一半,光是找资源就要花掉一半的开发时间。有一次为了找一个门把手材质,我翻遍了整个Content目录&…...

2026年毕业季降AI避坑指南:过来人总结的6个血泪教训

2026年毕业季降AI避坑指南:过来人总结的6个血泪教训 今年3月份,我身边有十几个同学在赶毕业论文,其中至少7个人用了AI辅助写作,然后都遇到了AIGC检测不过的问题。我自己也经历了一遍,中间踩了不少坑,有些弯…...

智慧水务平台如何助力县域供水系统升级——以山西某县为例

1. 县域供水系统的传统痛点与升级需求 山西某县的自来水公司曾面临着一系列典型的老旧供水系统问题。他们的调度系统建于2014年,采用无线网桥传输数据,就像用老式收音机收听节目一样,信号时断时续。我在实地考察时发现,维修人员最…...

2026年Kimi降AI效果好不好?实测3款降AI工具后我选了这个

2026年Kimi降AI效果好不好?实测3款降AI工具后我选了这个 说实话,我之前也是Kimi的重度用户。写论文、写方案、写报告,Kimi确实帮了不少忙。但去年年底交毕业论文初稿的时候,导师扔回来一句"你这个AI率62%,重新搞…...

Qt5实战:手把手教你用QPainter绘制一个工业级仪表盘(附完整源码)

Qt5实战:工业级仪表盘开发全流程解析与性能优化 在工业控制、汽车电子和能源监测领域,仪表盘作为关键的人机交互界面,其视觉效果和性能直接影响用户体验。本文将带您从零开始构建一个专业级仪表盘控件,不仅涵盖基础的QPainter绘图…...

Android性能优化实战:用simpleperf和FlameGraph生成火焰图的全流程指南

Android性能优化实战:用simpleperf和FlameGraph生成火焰图的全流程指南 在移动应用开发中,性能优化始终是开发者面临的核心挑战之一。特别是对于Android平台,随着应用功能日益复杂,性能瓶颈的定位和分析变得尤为关键。火焰图作为一…...

VirtualBox搭建Ubuntu 18.04嵌入式开发环境

VirtualBox 虚拟机环境搭建与 Ubuntu 18.04 部署实践指南1. 工程背景与部署目标在嵌入式系统开发流程中,构建稳定、可复现的交叉编译与软件验证环境是关键前提。尤其在涉及多平台 SDK(如“泰山派”AndroidLinux 混合开发套件)的项目中&#x…...

别再问怎么上线网站了!用宝塔面板+腾讯云域名,20分钟搞定个人博客部署

零基础20分钟部署个人博客:宝塔面板腾讯云全流程指南 刚学会HTML和CSS的新手开发者,往往在网站部署环节卡壳——服务器配置、域名解析、环境搭建这些术语听起来就让人头大。但今天我要告诉你一个秘密:用对工具,部署网站比写代码简…...

RK3566平台Android 11系统编译实战指南

1. Android系统编译:面向RK3566平台的工程化实践指南嵌入式Linux系统向Android演进的过程中,编译流程不再仅是源码到二进制的转换,而是一套覆盖引导加载、内核定制、框架集成与镜像打包的完整工程体系。本文以RK3566 SoC平台为载体&#xff0…...

英飞凌TC3xx——GTM(通用定时器模块)——从架构到实战:解锁多通道并行控制的汽车应用

1. 为什么汽车电子需要GTM这样的定时器模块 第一次接触英飞凌TC3xx系列的GTM模块时,我正负责一个电动汽车电机控制项目。当时用传统定时器实现六路PWM输出,CPU负载直接飙到70%以上,系统响应延迟明显。直到同事推荐了GTM模块,才真正…...