已采纳
回答正文
回复
讨论正文
该问题的正文与回答。
【背景】 我负责一个库存扣减服务:JDK 17 + Spring Boot 3 + Redis 7(Cluster)+ Lua 脚本,核心链路是用 Redis 分布式锁保证「读库存→判断→扣减→回写」的原子性。锁是自己实现的 Redlock 思路,TTL 设 10s,后台起了一个每 3s 检查一次的看门狗线程负责续期(PEXPIRE)。QPS 峰值约 3000,单机部署。
【现象】 上线三个月里出现 5 次「超卖 / 扣成负数」,每次都是同一形态:P50/P99 正常,但偶发某条库存被并发写成负数。抓现场发现,出问题的时间窗口里 JVM 正好有一次约 180ms 的 G1 停顿,看门狗线程在停顿期间没跑,TTL 在续期前就过期了,另一个节点拿到锁,两边同时扣减。
【已尝试的排查与结果】
【期望得到的答案形态】