
1) 【一句话结论】秒杀系统核心是“请求限流+分布式锁控制库存+异步订单生成”,通过Nginx分发请求、Redis实现分布式锁与库存预减,订单异步处理保证用户体验,同时保证库存一致性。
2) 【原理/概念讲解】老师讲解:
秒杀系统需解决高并发下的库存一致性与用户体验问题,核心环节包括请求分发、库存管理、订单生成。
SETNX(分布式锁)+事务(MULTI/EXEC)保证原子性,避免超卖(类比:超市货架上的商品,先抢“货架锁”再拿商品,防止多人同时拿走)。3) 【对比与适用场景】
| 方案 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 分布式锁(悲观锁) | 用Redis SETNX加锁,库存操作在锁内执行 | 严格保证一致性,但可能存在死锁 | 秒杀、抢票等高并发、强一致性场景 | 锁粒度大可能影响并发,需优化锁粒度 |
| 乐观锁(版本号) | 库存表加version字段,更新时检查版本 | 最终一致性,适合读多写少 | 日常购买(非秒杀) | 可能出现超卖,需补偿机制 |
| 最终一致性(消息队列+异步) | 秒杀成功后异步写入订单 | 高吞吐,弱一致性 | 秒杀等高并发场景 | 需保证消息不丢失,订单不重复 |
4) 【示例】
请求流程示例:
用户请求:GET /seckill?skuId=123&userId=1001
Redis SETNX lock:123 1 (过期时间1秒)Redis GET stock:123MULTI, DECR stock:123, EXECskuId, userId, quantity5) 【面试口播版答案】
面试官您好,秒杀系统核心是解决高并发下的库存一致性和用户体验。首先请求分发用Nginx结合限流(令牌桶),防止流量过大。库存管理用Redis的分布式锁+事务,保证原子性,避免超卖。订单生成异步处理,通过消息队列写入订单表,不阻塞秒杀请求。具体来说,用户请求先被Nginx限流,然后后端尝试获取分布式锁,锁内检查库存,库存够则扣减并异步下单,返回成功;否则返回失败。这样既保证了库存一致性,又提升了系统吞吐量,用户体验更好。
6) 【追问清单】
SETNX)+ Redis事务(MULTI/EXEC),原子性操作,防止超卖。acks=all)。7) 【常见坑/雷区】