跳到主要内容

秒杀系统架构设计

📺 配套视频

📝 知识点总结

核心原则

把请求挡在上游,层层过滤,最终到达数据库的请求越少越好。

分层架构

用户请求
→ 前端(按钮置灰 + 验证码 + 倒计时) 过滤 50% 无效请求
→ 网关(限流 + 黑名单 + 风控) 过滤 80% 恶意请求
→ 服务层(Redis 预扣库存) 过滤 99% 超卖请求
→ MQ 异步下单(削峰填谷) 保护数据库
→ 数据库(乐观锁扣减库存) 最终一致性

Redis 预扣库存(Lua 原子操作)

-- 预扣库存:原子操作,防止超卖
local stock = tonumber(redis.call('get', KEYS[1]))
if stock <= 0 then
return -1
end
redis.call('decr', KEYS[1])
return stock - 1

防超卖 SQL

-- 乐观锁:stock > 0 作为条件
UPDATE seckill_goods
SET stock = stock - 1
WHERE goods_id = #{goodsId} AND stock > 0

热点 Key 问题

单个商品的 Redis key 承受所有流量,解决方案:

  • 库存分片:将 1000 库存拆成 10 个 key,每个 key 100 库存
  • 本地缓存:JVM 内存缓存库存标记,库存为 0 后直接拦截

🔗 延伸阅读