秒杀系统是如何设计并实现原理拆解的?

摘要:秒杀系统的核心本质:超高并发(瞬间几万、几十万请求) + 超少库存(几件几十件商品) + 超短时间(几秒内售罄),目标是不超卖、不卡顿、用户公平、服务器不崩。 我会从核心原理 → 架构分层设计 → 关键
秒杀系统的核心本质:超高并发(瞬间几万、几十万请求) + 超少库存(几件/几十件商品) + 超短时间(几秒内售罄),目标是不超卖、不卡顿、用户公平、服务器不崩。 我会从核心原理 → 架构分层设计 → 关键技术细节 → 防超卖/防作弊 完整讲透,直接能用于面试/实战。 一、秒杀系统的核心矛盾(先懂原理) 秒杀的本质就是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,所有请求直接返回售罄。 为什么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