✅ 秒杀系统设计方案(实战 + 面试答疑全套)

🧱 一、整体目标与挑战

🎯 目标:

  • 高并发处理能力(百万 QPS)

  • 库存绝对准确

  • 用户体验不延迟

  • 防刷、防重放、防超卖、防重复下单

⚠️ 核心挑战:

挑战点说明
并发量大秒杀瞬间流量暴增,考验系统极限
数据一致性秒杀成功必须精准扣减库存
风控安全防止机器人、脚本刷单
系统抗压降低数据库压力,避免雪崩


🧰 二、系统架构总览(含削峰、防刷设计)



用户
 │
▼(验证码+令牌校验)
【获取动态秒杀路径】
 │
▼
【秒杀请求提交(带 path)】
 │
▼
【网关限流 + 验签 + 滑动窗口限流】
 │
▼
【Redis Lua:原子扣库存 + 用户去重】
 │
┌────────────────────────┐
│          Success       │
└────────────────────────┘
 │
▼
【发送秒杀消息 → MQ】
 │
▼
【消费者异步下单(幂等+落库+乐观锁)】
 │
▼
【写订单状态至 Redis】
 │
▼
【前端轮询结果接口 → 返回状态】


🔍 三、关键模块与技术组件

模块技术说明
前端动态 URL + 验证码防止提前刷单、路径暴露
网关Sentinel / NginxQPS限流、滑动窗口、黑名单
库存预扣Redis + Lua 脚本原子性扣减库存、防重入
削峰处理Kafka / RocketMQ消息异步处理,提升系统稳定性
订单落库MySQL + 乐观锁 + 唯一索引精准扣减库存、防止重复下单
状态查询Redis前端轮询异步结果
安全防护布隆过滤器 / 滑动窗口 / 验证码全面防刷


⚙️ 四、核心流程详解

✅ 1. 动态路径防刷(秒杀前置接口)

// 获取动态path接口
String path = MD5(userId + skuId + salt);
redis.setex("seckill:path:" + userId + ":" + skuId, 60, path);

✅ 2. Redis 库存扣减 + 用户去重

-- Redis Lua 脚本
if stock <= 0 then return -1 end
if user in success_set then return -2 end
DECR(stock)
SADD(success_user_set, userId)
return 1

✅ 3. 消息入队削峰(MQ)

  • Producer:发送秒杀消息(userId + skuId)

  • Consumer:落库(幂等校验 + 乐观锁更新)

✅ 4. 订单写库

UPDATE goods SET stock = stock - 1
WHERE id = ? AND stock > 0;
-- 插入订单时加唯一索引 (userId + skuId)

✅ 5. 状态查询接口(前端轮询)

// Redis 返回值: -1=失败, 0=排队中, 1=成功+订单ID
String result = redis.get("seckill:result:" + userId + ":" + skuId);


❓ 五、典型面试问题及答法


💬 Q1:你们系统怎么防止超卖?(重点)

答法模板:

三层机制防止超卖:

  • Redis Lua 脚本原子扣减库存,保证并发下不会多扣;

  • 数据库乐观锁防止并发写入冲突;

  • 消息队列异步下单,有效削峰解耦,最终落地只会写成功的单。


💬 Q2:不用缓存+数据库双写会不会导致数据不一致?

答法模板:

不用双写是为了避免一致性控制困难。在我们系统中采用 Redis 单写库存,消息队列异步落库 + 乐观锁二次确认库存,整个链路保证最终一致,且失败可重试。


💬 Q3:Redis 扣库存后 MQ 落库失败,用户怎么办?

答法模板:

我们不会立即告知用户“成功”,而是提示“排队中”,后台处理完成后将订单状态写入 Redis,用户通过轮询接口获取是否成功,避免了前端“假成功”。


💬 Q4:如何防止重复秒杀/重复下单?

答法模板:

Redis Set 去重(秒杀前置),数据库订单表加唯一索引(userId+skuId)控制幂等,再加 MQ 消费端幂等处理,三重保障防止重复下单。


💬 Q5:如何防止机器刷单?

答法模板:

多层防刷策略:

  • 获取秒杀 path 接口必须滑动验证码;

  • Path 一人一值,限时有效;

  • 接口限流 + 布隆过滤器阻断非法访问;

  • IP + UA 双重限制;网关层做黑名单防火墙。


🧩 六、总结一句话(项目描述口径)

我在项目中设计并实现了一套高并发秒杀系统,采用 Redis + Lua 原子扣库存 + MQ 异步落库 + MySQL 乐观锁 构建防超卖机制,配合动态路径、验证码与限流组件,有效承载百万级并发,确保库存精准、用户公平、系统稳定运行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值