Java 后端面试题库 / 全部题解免费阅读理解原理,有条理地回答

怎样用 Redis 原子扣库存?

先说出你的答案

定义边界、关键机制、一个反例;P8题再补容量、失败与验证。

查看完整题解

参考回答

直接回答

可用短 Lua 脚本一次完成取库存、判断够不够、扣减和返回结果。用权威数据库的条件更新与订单唯一约束保证最终正确性。

讲清原理

把 GET 和 DECR 分开,两笔请求可能都看见最后一件。脚本执行期间其他命令不会插入判断与扣减之间。跨系统写入需要幂等和对账。

预占、最终落库与失败回补需要独立处理
预占、最终落库与失败回补需要独立处理

例子与易错点

同一请求 ID 重试先查已有结果。脚本操作的键明确传入,Cluster 下使用同槽键。

演示预扣一件。脚本用同一个键,库存不足时返回 -1。

SET q82:stock 1
EVAL "local n=tonumber(redis.call('GET',KEYS[1]) or '0'); if n<1 then return -1 end; return redis.call('DECR',KEYS[1])" 1 q82:stock
EVAL "local n=tonumber(redis.call('GET',KEYS[1]) or '0'); if n<1 then return -1 end; return redis.call('DECR',KEYS[1])" 1 q82:stock

相关题 · 第 60 题、第 73 题

这道题,你掌握得怎么样?

掌握程度由你主动标记,阅读和收藏不会自动改变状态。