-
我用 Redis 加了分布式锁保护临界区,以为万无一失,结果偶发两个进程同时进了临界区、一个进程还把别人的锁给删了:一次分布式锁实现陷阱的深度复盘
我有段临界区代码用 Redis 加了分布式锁保护:SET lock NX EX 30 抢锁、处理完 DEL 释放,以为万无一失。可线上偶发两个进程同时进入临界区的数据错乱,有时还有一个进程把另一个进程正持有的锁删了。推演时序才看明白这锁有两个致命漏洞:漏洞一,锁 EX 30 过期了但业务还没跑完,锁自动释放、B 抢到、A 和 B 同时在临界区;漏洞二,释放时直接 DEL 没校验是不是自己的锁,A …- 0
- 0
-
一个 Redis 分布式锁的过期时间没扛住业务耗时,锁提前自动释放让两个线程同时进了临界区、还互相误删了对方的锁:一次分布式锁失效的深度复盘
用 Redis 分布式锁保证同一笔账只有一个节点处理,跑了大半年都好好的,直到对账量大、业务跑了 40 秒、超过了锁的 30 秒过期时间——锁中途自动释放,第二个线程进了临界区两线程同时处理,第一个线程干完 del 又删掉了第二个线程的锁,锁彻底形同虚设。本文讲透分布式锁的两大核心难题(过期时间两难、误删),给出唯一标识+Lua 原子校验删除防误删、看门狗自动续期解决过期、生产用 Redisson…- 0
- 0
-
我用 Redis 做分布式锁防止任务被重复处理,结果先是一个实例崩了导致所有任务卡死,后来又出现同一个任务被两个实例同时处理,我对着分布式锁这几个致命实现细节排查了大半天的复盘
一个让我对分布式锁看着简单实则处处是坑彻底敬畏的架构坑,它教会我用 Redis 加把锁这件听起来一行代码搞定的事要真正正确实现需要考虑一连串容易被忽略的细节,漏掉任何一个锁就会在某种场景失效——要么死锁卡死所有人要么形同虚设根本没锁住。多实例下要保证同一时刻只有一个实例处理某任务,我用 Redis 分布式锁逐步踩坑:版本1 SETNX+DEL 没过期时间,持锁实例崩了锁永不释放全卡死(死锁);版本…- 2
- 0
-
我用 Redis 加了分布式锁防并发,结果两个进程还是同时执行了、还互相把对方的锁删了,我对着分布式锁的几个致命细节排查了大半天的复盘
做了个多实例部署的定时任务,用 Redis 加分布式锁确保同一时刻只有一个实例执行,以为加了锁就万事大吉。结果生产诡异:有时两个实例同时跑(锁没锁住)导致数据重复处理,有时一个实例把另一个实例的锁删了。盯着 SETNX 抢锁、DEL 释放的标准代码反复看,排查大半天才发现藏着三个致命细节:SETNX 没设过期(持锁者崩溃就死锁)、锁提前过期(业务跑40秒超过锁30秒过期,A还在执行B就抢到锁同时执…- 0
- 0
-
我用 Redis 加了分布式锁防并发,结果偶尔还是有两个节点同时拿到锁、把临界区并发执行了,我对着这把"形同虚设"的锁排查了大半天的复盘
我用 Redis 的 SETNX 加锁、设过期时间防死锁、用完 DEL 释放,实现了分布式锁防并发,结果临界区偶尔还是被两个节点同时执行、锁形同虚设,还极其偶发难复现。把时序画出来才懂两个致命问题:① 业务执行时间超过了锁的过期时间,锁自动到期释放、另一个节点趁机拿到锁,于是两节点同时持锁;② 释放锁直接 DEL 没校验"是不是自己的锁",A 超时后 B 拿到锁,A 执行完却把…- 0
- 0
-
对账邮件发了三遍:多实例定时任务避坑复盘
那天上午客服转来一条用户投诉让我心里咯噔一下:你们的对账邮件我今天早上一口气收到了三封一模一样,是不是系统出 bug 了?我第一反应是邮件服务重试了?可一查发邮件的代码确确实实只被成功调用了三次,每次都正大光明地发了一封,不是重试是实打实地执行了三遍。而这个发对账邮件的任务是一个每天凌晨定时跑一次的定时任务,逻辑里清清楚楚写着每个用户发一封,怎么会发三封?真相藏在一个我们为了高可用而做的本身完全正…- 0
- 0
-
Redis 缓存设计完全指南:从一次"主播开播 10 万人涌入缓存击穿 MySQL 5 分钟挂掉"看懂为什么 SET GET 远远不够
2021 年我在一家社交 App 公司负责后端用 Redis 做缓存层 20 多个微服务都接它第一版我们就 Set Get 用得很爽大家觉得 Redis 是银弹啥都可以缓存然后业务起飞日活 500 万缓存层就开始陆续出问题一周内连续两次大面积故障缓存击穿缓存雪崩缓存穿透全踩了一遍然后我们陆续踩了一堆坑第一种最让我傻眼一次热门主播开播 10 万人涌入查他的资料主播缓存刚好过期 10 万请求同时打到 …- 2
- 0
-
Redis 分布式锁完全指南:从一次"同一笔订单被扣三次款"看懂 SET NX EX 为什么不是分布式锁
2023 年我接手一个老项目里面有个用 Redis 做的分布式锁场景是订单去重防止用户连续点击下单按钮造成重复扣款这套锁跑了两年没出过事我以为它就是稳的某天大促当晚一个用户疯狂连点付款页面客服那边几分钟后就传来同一笔订单被扣了三次的截图我打开日志一看三次请求确实都拿到了锁三次都执行了下单我去翻代码这把锁的实现是经典的 SET key value EX 30 NX 加锁成功就执行业务执行完 DEL …- 0
- 0
-
分布式锁完全指南:从一次"多实例部署后库存被超卖"看懂为什么单机锁挡不住分布式并发
2023 年我做一个电商的库存扣减接口用户下单要先扣库存怎么保证不会超卖这件事我没多想就有了方案加锁第一版我做得很顺手在扣库存的那段代码外面用一把锁圈起来同一时刻只放一个请求进去查库存够不够够就扣不够就拒绝本地一压测真不错并发再高库存也扣得分毫不差从来不会扣成负数我心里很笃定我都加锁了临界区同一时刻只有一个请求并发安全这不就有了可等这个接口真正上线被部署成多个实例扛起生产流量一串问题冒了出来第一种…- 4
- 0
-
分布式锁完全指南:从一次"加了锁还超卖、库存被扣成负数"看懂分布式锁
2022 年我做一个秒杀活动的库存扣减接口。逻辑很简单:用户下单先查库存够不够,够就扣减一个。第一版在单机上跑,为了防止两个请求同时扣减同一个库存导致超卖,我加了个进程内的锁 threading.Lock。本地压测单机上线都没问题。后来活动流量涨了,运维把服务部署成了三个实例挂在负载均衡后面。某次活动结束我对账,发现一件吓人的事:库存明明只有 100 件,却卖出去了 130 单,超卖了 30 件。…- 2
- 0
-
分布式锁完全指南:从一次"扩容后对账任务跑了三遍、结算被重复打款"看懂分布式锁
2023 年我维护一个对账定时任务,每天凌晨核对订单和支付流水、生成结算单、发结算邮件。单实例跑了大半年稳稳当当,直到运维把服务从 1 个实例扩容到 3 个,第二天就出事:同一用户收到三封结算邮件,有几笔结算被重复打款。翻代码一行 bug 都没有,盯着部署结构才反应过来:定时任务代码被原封不动部署到 3 个实例上,凌晨那一刻 3 个实例各自都跑了一遍。我以为代码里加了 Lock 就并发安全,真相是…- 0
- 0
-
分布式锁完全指南:从一次"两个人买走同一件库存"看懂 Redis 锁的所有坑
2023 年我负责电商库存扣减,逻辑很朴素:查库存、大于零就减一。Demo 毫无问题,直到一次大促对账发现可怕的事——一个标价 100 件的爆款,系统让 103 个人下单成功了,超卖。问题不在那三行业务,在并发:两个请求同时查到库存 1、同时判断大于零、同时各扣一次。我以为加把锁就行,用 synchronized 本地不超卖了,一上线超卖照旧——服务多实例部署,synchronized 只锁单个 …- 0
- 0
-
分布式锁完全指南:Redis 分布式锁的正确打开方式
一场秒杀活动让我栽了个跟头:商品库存 100 件,扣库存那段我特意加了锁 —— synchronized 把"查库存、判断够不够、扣减"三步整个包住,自觉绝不可能超卖。活动结束运营找来:卖出去 103 件。代码翻了十几遍 synchronized 明明白白包在那里逻辑没错,直到看了一眼部署架构图才一身冷汗:服务部署了 3 台机器 = 3 个独立 JVM 进程,synchroni…- 0
- 0
-
库存卖超了 7 件:一次 Redis 分布式锁踩坑的复盘
秒杀某 SKU 库存 100 却卖出 107,根子是手写的 Redis 分布式锁:加锁与设过期非原子、解锁直接 delete 误删别人的锁、固定过期时间业务超时即失效、主从切换锁直接丢。几天重写分布式锁:SET NX PX、Lua 安全解锁、看门狗续期、Redisson、数据库兜底、锁监控。- 2
- 0
-
Redis 分布式锁踩了三个坑:超时、误删、主从切换丢锁实录
库存扣减用 Redis 分布式锁防超卖,某次大促对账发现 37 个商品超卖。复盘出三个经典坑:加锁非原子、误删别人的锁、主从切换丢锁。投一周重写:SET NX PX 原子加锁 + Lua 校验 token 解锁 + 看门狗续期 + Redisson + DB WHERE num>=qty 兜底 + 热点商品分段锁,大促零超卖。- 0
- 0
-
Redis 分布式锁踩过的 5 个坑:从 SETNX 到 Redlock 到 fencing token
秒杀超卖 1 件复盘:Redis 主从切换导致锁失效。本文讲透 5 种错误实现 + 正确的 SET NX PX + Lua、Redisson watchdog、Redlock 算法、Martin Kleppmann 的质疑、fencing token 思路,以及 etcd 强一致锁的对比。附完整 Java 代码 + 选型建议。- 0
- 0
-
Redis 完全指南:从 5 种数据结构到 Cluster 部署实战
Redis 是当代后端系统的"瑞士军刀" —— 缓存、计数器、排行榜、分布式锁、消息队列、限流、地理位置、布隆过滤器,几乎所有内存级别的数据结构需求都能用它解决。但要真用好 Redis,得理解每种数据结构的底层实现、持久化的代价、集群模式的差异。这篇文章把 Redis 从核心数据结构讲到生产部署,所有要点都配命令和实战。 5 种基础数据结构 + 3 种高级 String:不只是…- 0
- 0
-
幂等性与分布式锁完全指南:幂等 Token、Redis 锁与 Snowflake ID
"用户重复点击下单按钮,产生了两个订单。""扣款接口因网络重试调用了两次,用户被扣了两次钱。""消息队列重发,业务被执行两次。"—— 这些场景的根源都是同一个:缺乏幂等性。这篇文章把幂等性、分布式锁、分布式 ID 这三个紧密相关的话题一次讲透,因为它们经常组合出现在解决方案里。 幂等性的定义 简单说:同一个操作执行 N 次和执行 1 次效…- 9
- 0
分布式锁
幸运之星正在降临...
点击领取今天的签到奖励!
恭喜!您今天获得了{{mission.data.mission.credit}}积分
我的优惠劵
-
¥优惠劵使用时效:无法使用使用时效:
之前
使用时效:永久有效优惠劵ID:×
没有优惠劵可用!


















