秒杀的本质是极短时间内的极高并发写同一热点资源(库存),设计主线是分层过滤、层层减压,让到达数据库的流量接近真实成交量。1)前端/接入层:开抢前按钮置灰、答题/验证码拉长请求间隔(人机识别 + 削峰)、CDN 扛商品页静态流量;2)网关层:按用户限流(每用户每秒 1 次)、黑名单、隐藏真实接口地址防提前刷;3)服务层:库存预热到 Redis,扣减用 Lua 脚本原子完成(判断库存 > 0 则 DECR 并记录用户防重),MQ 异步创建订单——数据库只做最终落库,扣减与下单解耦;4)数据层:订单异步批量写入,库存最终一致性由 MQ 消费保证。

关键问题与取舍:防超卖——Redis 原子扣减是第一道,DB 加乐观锁(UPDATE ... WHERE stock > 0)兜底;防少卖——超时未支付订单释放库存回 Redis;热点隔离——秒杀系统独立部署,避免拖垮主站;一致性兜底——定时对账任务核对 Redis 与 DB 库存差异;降级预案——库存卖完后快速失败返回,队列积压时熔断下单接口。追问方向:为什么不在数据库直接扣(行锁热点 + 连接数打满)、Lua 脚本的原子性边界(Redis Cluster 下 key 需同槽)、令牌预发(先到先得改为抽签制)的公平性变种。

(约 480 字)