🧱 一、整体目标与挑战
🎯 目标:
-
高并发处理能力(百万 QPS)
-
库存绝对准确
-
用户体验不延迟
-
防刷、防重放、防超卖、防重复下单
⚠️ 核心挑战:
挑战点 | 说明 |
---|---|
并发量大 | 秒杀瞬间流量暴增,考验系统极限 |
数据一致性 | 秒杀成功必须精准扣减库存 |
风控安全 | 防止机器人、脚本刷单 |
系统抗压 | 降低数据库压力,避免雪崩 |
🧰 二、系统架构总览(含削峰、防刷设计)
用户
│
▼(验证码+令牌校验)
【获取动态秒杀路径】
│
▼
【秒杀请求提交(带 path)】
│
▼
【网关限流 + 验签 + 滑动窗口限流】
│
▼
【Redis Lua:原子扣库存 + 用户去重】
│
┌────────────────────────┐
│ Success │
└────────────────────────┘
│
▼
【发送秒杀消息 → MQ】
│
▼
【消费者异步下单(幂等+落库+乐观锁)】
│
▼
【写订单状态至 Redis】
│
▼
【前端轮询结果接口 → 返回状态】
🔍 三、关键模块与技术组件
模块 | 技术 | 说明 |
---|---|---|
前端 | 动态 URL + 验证码 | 防止提前刷单、路径暴露 |
网关 | Sentinel / Nginx | QPS限流、滑动窗口、黑名单 |
库存预扣 | 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 乐观锁 构建防超卖机制,配合动态路径、验证码与限流组件,有效承载百万级并发,确保库存精准、用户公平、系统稳定运行。