高频面试题:设计秒杀系统,用Redis+Lua解决超卖
在秒杀或高并发库存扣减场景中,使用 Redis + Lua 解决超卖问题是一个经典的方案。以下是详细的实现逻辑和面试回答话术,突出技术深度和项目实践:
1. 问题背景
超卖原因:
高并发下,多个请求同时查询库存并扣减,导致库存扣减顺序混乱,最终库存为负数(如:剩余1件商品,但多个请求同时判定有库存,最终卖出多件)。
2. 解决方案:Redis + Lua
为什么选择Redis + Lua?
- 原子性:Lua脚本在Redis中单线程执行,保证多个操作的原子性。
- 高性能:Redis内存操作+Lua脚本避免网络往返(减少
GET+DECR的多次交互)。 - 避免分布式锁:比
SETNX等方案更轻量,无锁竞争开销。
核心代码逻辑
-- KEYS[1]: 库存key(如 "seckill:stock:123")
-- ARGV[1]: 扣减数量(通常为1)
local stock = tonumber(redis.call('GET', KEYS[1]))
if stock <= 0 then
return 0 -- 库存不足
end
if stock >= tonumber(ARGV[1]) then
redis.call

最低0.47元/天 解锁文章
689

被折叠的 条评论
为什么被折叠?



