高并发秒杀系统设计实战
一、系统架构设计
1. 分层架构
典型的秒杀系统采用分层过滤策略,流量逐层衰减:
客户端层 → 接入层 → 业务服务层 → 数据层
限流 缓存 队列 数据库
2. 具体组件
- 客户端:静态资源 CDN 加速、倒计时校准、防重复提交。
- 接入层:Nginx + Lua/OpenResty,负责第一层限流和静态缓存。
- 业务层:
- 秒杀服务集群(无状态)
- 消息队列(Kafka/RocketMQ)削峰
- 缓存集群(Redis Cluster)
- 数据层:
- 主从数据库(读写分离)
- 分库分表(按商品或时间维度)
二、核心问题解决方案
1. 超卖问题
这是秒杀系统的红线。我们通常组合使用 Redis 原子操作与数据库乐观锁。
方案一:Redis 原子操作
利用 Lua 脚本保证检查库存和扣减库存的原子性。
// Lua 脚本示例
local stock = tonumber(redis.call('GET', KEYS[1]))
if stock and stock > 0 then
redis.call('DECR', KEYS[1])
return 1
end
return 0
在 Java 中调用时,直接执行该脚本,若返回 1 则代表扣减成功。
方案二:数据库乐观锁
作为最终兜底,防止极端情况下的数据不一致。
UPDATE products
SET stock = stock - 1, version = version + 1
WHERE id = ? AND stock > 0 AND version ?


