
1) 【一句话结论】在电商促销(如双11)高并发场景下,通过分层微服务架构(拆分订单、库存、支付等模块)、结合缓存(Redis)与数据库(分库分表+读写分离)的优化策略,以及异步消息队列(如Kafka)解耦,成功支撑百万级订单处理,核心是“架构解耦+资源隔离+缓存+数据库双保险”。
2) 【原理/概念讲解】老师口吻,解释高并发系统设计的关键点:
高并发系统需解决“单点故障”与“资源瓶颈”问题,核心是通过水平扩展(如微服务拆分、集群部署)分散压力。
3) 【对比与适用场景】
以缓存策略为例,对比不同场景下的处理方式:
| 缓存策略 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 缓存雪崩 | 大量缓存同时过期 | 瞬时流量激增 | 高并发场景(如双11) | 设置过期时间随机化,避免集中过期 |
| 缓存击穿 | 单个热点数据缓存过期 | 单点压力 | 热点数据(如秒杀商品) | 用互斥锁/分布式锁+过期时间,避免并发竞争 |
| 缓存穿透 | 查询不存在的数据 | 恒定流量 | 防止恶意攻击 | 用布隆过滤器或空值缓存,设置过期时间 |
4) 【示例】
假设订单服务处理订单创建,核心流程(伪代码):
# 订单创建流程(伪代码)
def create_order(user_id, product_id, quantity):
# 1. 检查库存(缓存优先)
stock = get_stock_from_cache(product_id)
if stock is None:
stock = query_stock_from_db(product_id) # 查数据库
set_stock_to_cache(product_id, stock) # 写入缓存
if stock < quantity:
return "库存不足"
# 2. 检查订单是否已存在(缓存订单ID)
order_id = get_order_id_from_cache(user_id, product_id)
if order_id is not None:
return "订单已存在"
order_id = generate_order_id() # 生成订单ID
# 3. 创建订单(数据库写,事务保证一致性)
with db.transaction():
insert_order_to_db(order_id, user_id, product_id, quantity)
update_user_balance_db(user_id, -price) # 扣减余额
# 4. 异步扣库存(消息队列解耦,避免阻塞)
send_message_to_kafka("decrease_stock", product_id, quantity)
# 5. 写入缓存(订单ID,避免重复下单)
set_order_id_to_cache(user_id, product_id, order_id)
return "下单成功"
5) 【面试口播版答案】
在之前负责的电商促销项目中,比如双11,我们系统需要支撑百万级订单。首先,我们采用了微服务架构,把订单、库存、支付拆分成独立服务,通过API网关统一入口,实现服务解耦。然后,针对数据库压力,做了分库分表(按订单ID哈希分库),读写分离(主库写、从库读),同时为高频查询的库存数据,引入Redis缓存,设置过期时间并随机化,避免缓存雪崩。对于订单创建这种高并发写操作,我们用数据库事务保证数据一致性,同时通过消息队列异步处理库存扣减,避免阻塞主流程。另外,为了防止缓存穿透,对不存在的商品查询,先返回空值并设置过期时间。最终,系统在双11期间,订单处理延迟控制在200ms以内,并发量达到百万级,没有出现服务崩溃或数据库超载的情况。
6) 【追问清单】
SETNX命令(原子操作)实现,或者使用分布式锁框架(如Redisson),保证并发下只允许一个线程执行关键操作(如库存扣减)。7) 【常见坑/雷区】