优惠券服务用 Redis 分布式锁防止重复领取,但发生锁过期后两个请求都完成了发券;你会如何定位问题并补充令牌校验或业务幂等保护?
旗舰版来源:alibaba中级工程师业务幂等保护Redis分布式锁锁过期库存扣减一致性消息幂等设计
草稿
答案解析
我会先明确一点:Redis 分布式锁只能降低并发冲突概率,不能作为发券成功与否的唯一保障。锁过期后两个请求都完成发券,本质上说明业务缺少最终幂等保护。
定位时我会从几个方向排查:
1. 确认锁是否真的提前过期 看加锁时设置的 TTL 是多少; 发券链路耗时是否超过 TTL,比如查券、扣库存、写领取记录、调用三方、发 MQ 等; 是否存在 GC、网络抖动、数据库慢 SQL、线程池排队导致请求执行时间变长。
2. 检查解锁逻辑是否安全 加锁时 value 必须是唯一 token,比如 UUID + 线程标识; 解锁时不能直接 DEL key,必须先判断 value 是否是自己的,再删除; 这个判断和删除要用 Lua 脚本保证原子性。
例如:
```lua if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 en
登录后查看完整内容
