秒杀系统架构设计与核心问题解决方案
一、系统架构设计
1. 分层架构
整体采用分层过滤策略,请求流向如下:
客户端层 → 接入层 → 业务服务层 → 数据层
限流 缓存 队列 数据库
2. 具体组件
- 客户端:静态资源 CDN 加速、倒计时校准、防重复提交。
- 接入层:Nginx+Lua/OpenResty,负责第一层限流和缓存。
- 业务层:秒杀服务集群(无状态)、消息队列(Kafka/RocketMQ)、缓存集群(Redis Cluster)。
- 数据层:主从数据库(读写分离)、分库分表(按商品/时间)。
二、核心问题解决方案
1. 超卖问题
解决库存扣减的并发安全是重中之重,主要有三种思路。
Redis 原子操作
利用 Lua 脚本保证检查与扣减的原子性,避免多线程竞争。
-- 使用 Redis 的 DECR 原子操作扣减库存
def deduct_stock(product_id, user_id):
stock_key = f"stock:{product_id}"
lua_script = """
local stock = tonumber(redis.call('GET', KEYS[1]))
if stock and stock > 0 then
redis.call('DECR', KEYS[1])
return 1
end
return 0
"""
result = redis.eval(lua_script, 1, stock_key)
return result == 1
数据库乐观锁
作为兜底方案,在数据库层面增加版本号控制。
UPDATE products SET stock = stock - 1, version = version + 1
WHERE id = ? AND stock > 0 AND version = ?
预扣库存
先预扣 Redis 库存,再异步同步到 DB,提升响应速度。
// 先预扣 Redis 库存,再异步同步到 DB
public {
+ productId;
redisTemplate.opsForValue().decrement(key, count);
(remaining >= ) {
sendStockDeductMessage(productId, count);
;
} {
redisTemplate.opsForValue().increment(key, count);
;
}
}


