REDIS 并发实验 · 库存扣减
读、判断、写之间,别人能不能插进来?
两个请求同时抢最后一件商品。逐步执行同一段业务逻辑,观察应用层的三次往返如何留下竞态窗口,以及 Lua 为什么能把窗口关上。
初始条件
库存 1 · 并发 2
A、B 各购买 1 件
请求穿插时间线
步骤 0 / 6时间 ↓
请求 A
请求 B
Redis
请求 A
请求 B
Redis 命令
应用层:三段逻辑,三处可被穿插
const stock = Number(await redis.get(key));
if (stock < quantity) return { ok: false };
await redis.decrBy(key, quantity);
return { ok: true };
问题不在某条命令,而在命令之间
GET 和 DECRBY 各自都是原子的,但业务判断横跨了两次 Redis 调用。A 读完之后,B 可以插入;两边都拿着同一份“库存还够”的旧结论继续执行。