秒杀系统设计(超详细+原理拆解,小白也能懂)
秒杀系统的核心本质:超高并发(瞬间几万、几十万请求) + 超少库存(几件/几十件商品) + 超短时间(几秒内售罄),目标是不超卖、不卡顿、用户公平、服务器不崩。
我会从核心原理 → 架构分层设计 → 关键技术细节 → 防超卖/防作弊 完整讲透,直接能用于面试/实战。
一、秒杀系统的核心矛盾(先懂原理)
秒杀的本质就是3大冲突,所有设计都是为了解决它们:
- 流量洪峰 vs 服务器承载力
平时100QPS,秒杀瞬间10万QPS,直接打崩数据库/服务器。 - 超卖问题
库存只有10件,结果卖出100件,商家亏损。 - 公平性与作弊
防止脚本、黄牛抢光商品,普通用户抢不到。
一句话总结秒杀原理:
前端限流挡一部分 → 中间层缓存扛并发 → 数据库最终兜底扣库存 → 异步下单不阻塞,层层过滤,把无效请求全部拦在数据库之外。
二、完整架构设计(分层拆解,每一层干什么+原理)
整体架构流程图
用户请求 → 前端限流 → CDN → 网关层 → 缓存层(Redis) → 消息队列 → 服务层 → 数据库
三、逐层级详细设计 + 原理
1. 前端层:第一道拦截(最直接的流量过滤)
目标:把无效请求、重复请求、脚本请求直接挡在浏览器端,不让请求发到服务器。
关键设计
- 按钮置灰/倒计时
- 原理:秒杀未开始时,按钮不可点击,从源头减少无效请求。
- 防止重复点击
- 原理:点击一次后,JS锁定按钮3秒,禁止重复提交。
- 图片验证码/滑块验证
- 原理:必须人工验证才能发起请求,90%秒杀脚本直接失效。
- 请求频率限制
- 原理:同一个用户1秒只允许发1~2次请求,超过直接拒绝。
前端原理总结:能在前端挡住的请求,绝不放到后端。
2. 网关/接入层:第二道拦截
目标:统一入口,做全局限流、黑白名单、服务熔断。
关键技术
- 全局限流(令牌桶/漏桶算法)
- 原理:服务器每秒只放1000个请求进入,多余的直接返回“系统繁忙”。
- 公式:放行请求数 = 商品库存 × 20~50倍(留冗余)。
- 服务熔断、降级
- 原理:并发太高时,直接拒绝非核心请求,保证秒杀接口可用。
- IP/用户限流
- 原理:同一个IP/用户ID,每秒最多放行1次请求。
3. 缓存层(Redis):秒杀系统的心脏
核心原理:所有秒杀“判断库存+扣减库存”全部在Redis完成,绝对不直接查数据库。
Redis扛10万QPS轻松,MySQL扛1000QPS就吃力,这是秒杀不崩的关键!
核心操作
-
秒杀前:把商品库存提前写入Redis
SET seckill:stock:1001 10 -
秒杀中:使用 Redis DECRBY 原子扣减
- 原理:
DECRBY是原子操作,多个线程同时执行也不会超卖。 - 逻辑:
- 库存 ≥ 1 → 扣减成功 → 进入下单流程
- 库存 < 1 → 直接返回“已售罄”
- 原理:
-
Redis标记秒杀结束
- 当库存扣到0,设置标记
seckill:end:1001 = 1,所有请求直接返回售罄。
- 当库存扣到0,设置标记
为什么Redis能抗高并发?
- 纯内存操作,微秒级响应
- 单线程原子命令,天然解决并发超卖
- 性能是MySQL的 50~100倍
4. 消息队列(Kafka/RabbitMQ):削峰填谷
原理:Redis扣减成功的请求,不直接写数据库,而是扔进消息队列排队,慢慢消费。
作用:
- 把瞬间高并发 → 变成平滑流量
- 防止服务被同步请求压垮
- 异步解耦,不阻塞用户
流程:
Redis扣库存成功 → 发送消息到队列 → 消费者异步生成订单
5. 服务层:业务逻辑处理
只做两件事:
- 校验用户合法性(是否重复秒杀)
- 消费消息队列,生成订单
重复秒杀控制:
用Redis集合记录已秒杀成功的用户ID:
SADD seckill:uid:1001 10086
- 存在 → 重复下单 → 拒绝
- 不存在 → 允许下单
6. 数据库层:最终兜底
核心职责:真正扣减库存、生成订单,保证数据绝对不超卖。
关键:数据库乐观锁防止超卖
UPDATE product
SET stock = stock - 1
WHERE id = 1001 AND stock > 0;
- 原理:
stock > 0是最后一道防线 - 只有满足条件才扣减,绝对不超卖
四、秒杀系统最核心的3个问题(面试必问)
1. 如何保证不超卖?(三重防护)
- Redis原子扣减(第一道)
- 用户唯一标记(第二道)
- 数据库乐观锁(最后兜底)
三层防护,绝对不可能超卖。
2. 如何扛住高并发?
核心口诀:能缓存就缓存,能异步就异步,能过滤就过滤
- 99% 请求在前端、网关、Redis被拦截
- 只有极少请求最终到达数据库
3. 如何防止黄牛/脚本?
- 前端验证码(挡机器)
- 用户登录+实名认证
- 同一用户限购1件
- 下单后15分钟未支付自动取消库存
五、标准秒杀流程(完整闭环)
- 用户点击秒杀
- 前端验证验证码、防重复点击
- 网关限流,非法请求直接拒绝
- Redis原子扣减库存
- 失败 → 返回售罄
- 成功 → 发送消息到队列
- 队列异步消费,生成订单
- 数据库扣库存,最终确认
- 返回用户“秒杀成功”
六、技术栈总结(企业级标准)
- 前端:Vue/React + 防抖 + 验证码
- 网关:Spring Cloud Gateway、Nginx
- 缓存:Redis(原子操作、限流、库存)
- 消息队列:Kafka/RocketMQ
- 服务:SpringBoot
- 数据库:MySQL(乐观锁)
总结
- 秒杀系统核心原理:层层过滤 + 异步削峰 + 内存扛并发 + 数据库兜底
- Redis是灵魂:所有库存判断、扣减必须走Redis
- 不超卖关键:Redis原子扣减 + 数据库乐观锁
- 高并发关键:不让大量请求打到MySQL
百流积聚,江河是也;文若化风,可以砾石。

浙公网安备 33010602011771号