系统架构设计
分层架构
典型的秒杀系统采用分层处理模式,从客户端到数据层依次进行流量过滤与缓冲:
客户端层 → 接入层 → 业务服务层 → 数据层
限流 缓存 队列 数据库
具体组件
- 客户端:静态资源走 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
方案二:数据库乐观锁
作为兜底方案,防止极端情况下的数据不一致。
UPDATE products
SET stock = stock - 1, version = version + 1
WHERE id = ? AND stock > 0 AND version = ?;
方案三:预扣库存
先扣减 Redis 库存,再异步同步至数据库。
public {
+ productId;
redisTemplate.opsForValue().decrement(key, count);
(remaining >= ) {
sendStockDeductMessage(productId, count);
;
} {
redisTemplate.opsForValue().increment(key, count);
;
}
}


