怎样用 Redis 原子扣库存?
查看完整题解
参考回答
直接回答
可用短 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 题
这道题,你掌握得怎么样?
掌握程度由你主动标记,阅读和收藏不会自动改变状态。