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 可以插入;两边都拿着同一份“库存还够”的旧结论继续执行。