秒杀项目常见面试题
秒杀项目常见面试题
0、介绍一下你的项目
为什么做这个项目?
希望将过去所学的一些知识进行系统化的深入理解。秒杀项目应用场景丰富,涉及高并发、缓存、消息队列、分布式锁等多个中间件,更有利于对 Web 服务架构的深入学习。
项目整体流程
项目主要模拟高并发秒杀场景。请求到达 Nginx 后,通过负载均衡策略分发到后端两台服务器。
为解决秒杀场景中的入口流量和瞬时高并发问题,引入了 Redis 作为缓存中间件,实现缓存预热、库存预扣减等功能;通过秒杀令牌与秒杀大闸机制限制入口流量;通过线程池技术实现流量削峰,缓解系统瞬时压力。
1、秒杀中如何处理超卖问题?
仅依靠 MySQL 时,可以通过库存条件更新语句实现:
update table_prmo
set num = num - 1
where id = 1001
and num > 0;
更常见的方案是利用 Redis 单线程特性进行库存预扣减。
- 系统启动时,将商品库存预热到 Redis。
- 用户请求到达后,先在 Redis 中执行库存预减。
- 库存不足直接返回失败。
- 库存扣减成功后进入异步队列。
- 消费者生成订单并扣减数据库库存。
2、秒杀中如何解决重复下单问题?
采用:
- MySQL 唯一索引(用户ID + 商品ID)
- 分布式锁控制并发
3、热点数据失效(缓存击穿)问题如何解决?
热点数据设置为永不过期。
4、缓存和数据库数据一致性如何保证?
- 使用 Canal 监听 MySQL Binlog 实现同步。
- 先更新数据库,再删除缓存。
- 缓存失效后重新从数据库加载数据。
5、减库存成功但生成订单失败怎么办?
单体项目可通过 Spring 事务解决。
分布式环境下需要使用分布式事务保证库存与订单的一致性。
相关理论
- CAP 理论
- BASE 理论
常见解决方案
- 全局消息
- 可靠消息最终一致性(MQ)
- TCC
- 最大努力通知
- Seata 分布式事务
6、做了哪些限流削峰措施?
- 秒杀令牌(Token)
- 秒杀大闸机制
- 线程池削峰
- 验证码防刷
7、如何解决恶意下单问题?
通过 Nginx 进行 IP 访问频率限制。
访问频率异常的 IP 可以自动拉黑。
8、多机器扣减库存如何保证线程安全?
使用 Redis 分布式锁。
实际项目中通常采用 Redisson 实现分布式锁。
9、如何扣减 Redis 中的库存?
Redis 原子操作:
- decrement:库存减一
- increment:库存加一
以上命令均具备原子性。
10、缓存突然失效导致大量请求打到数据库怎么办?
这是典型的缓存雪崩问题。
解决方案是在缓存过期时间基础上增加随机值。
11、Redis 挂掉后如何减轻数据库压力?
搭建 Redis 高可用集群。
主从模式
主节点故障后,从节点通过:
slaveof no one
解除主从关系并提升为主节点。
哨兵模式
核心机制:
- 心跳检测(Ping/Pong)
- 投票选举
当 Sentinel 判断 Master 宕机后,会自动选举新的 Master。
12、页面静态化
将静态资源提前部署到 CDN,减轻秒杀时服务器压力。
13、秒杀系统面临的问题
- 高并发
- 超卖问题
- 重复下单问题
- 恶意请求
- 数据库压力过大
- 缓存击穿
- 缓存穿透
- 缓存雪崩
14、秒杀系统架构设计
- Nginx 动静分离与负载均衡
- Redis 缓存预热与库存预减
- MQ 异步下单
15、分布式会话问题
通过 Token + Redis 实现分布式会话。
用户首次登录成功后生成 Token,并将用户信息存入 Redis。
// 首次登录
String uuid = UUID.randomUUID().toString();
redisTemplate.opsForValue().set(uuid, userModel);
// Token 返回客户端保存
后续请求携带 Token,从 Redis 获取用户信息完成身份验证。
16、线程池执行过程
核心参数
- corePoolSize:核心线程数
- maximumPoolSize:最大线程数
- keepAliveTime:非核心线程存活时间
- unit:时间单位
- workQueue:阻塞队列
- threadFactory:线程工厂
- handler:拒绝策略
执行流程
- 优先创建核心线程。
- 核心线程满后进入阻塞队列。
- 阻塞队列满后创建非核心线程。
- 达到最大线程数后执行拒绝策略。
17、项目中的难点
限流与削峰设计
采用秒杀令牌和秒杀大闸机制控制入口流量。
例如:
10 万用户抢购 10 件商品,仅允许部分用户进入系统。
// 设置秒杀大闸
redisTemplate.opsForValue()
.set("door_count"+promoId,itemModel.getStock()*5);
// 获取剩余令牌
int dazha =
redisTemplate.opsForValue()
.get("door_count"+promoId);
if(dazha <= 0){
throw new Exception();
}else{
String token =
UUIDUtils.getUUID()+promoId;
redisTemplate.opsForValue()
.set(userToken,token);
}
高并发流量限制
- 线程池
- Semaphore 信号量
分布式会话问题
通过 Cookie 共享和 Redis 存储 Token 解决登录状态不一致问题。
18、项目中 Redis 做了什么?
- 缓存中间件
- 库存预减
- 热点数据缓存
19、项目中 ActiveMQ 做了什么?
作为异步下单中间件,利用消息队列缓解数据库压力。
20、线程池核心线程数经验值
| 场景 | 推荐配置 |
|---|---|
| CPU密集型 | N + 1 |
| IO密集型 | 2N + 1 |
21、TPS 提升情况
| 阶段 | TPS |
|---|---|
| 基础架构 | 200 |
| 引入 Nginx、Redis、分布式扩展后 | 2500 |
22、Nginx 负载均衡策略
- 轮询(Round Robin)
- 权重(Weight)
- IP Hash
- 最少连接(Least Connections)
23、项目架构
秒杀系统整体采用 Nginx + Redis + MQ + MySQL 架构。
24、引导用户进入降级页面是什么意思?
当系统流量过大或服务异常时,引导用户进入降级页面,避免系统雪崩。
25、Redis 与 MySQL 数据一致性问题
常见方案:
- 更新数据库后删除缓存
- Canal 监听 Binlog 同步缓存
- MQ 最终一致性方案
26、电脑和手机同时抢购会颁发几个 Token?
同一用户无论登录多少设备,本质上对应同一个账号。
系统只会为用户颁发一个有效 Token。
27、如何利用线程池实现流量削峰?
通过限制线程池最大线程数控制系统并发量,其余请求进入队列等待。
28、线程池拒绝策略
ThreadPoolExecutor.AbortPolicy
// 丢弃任务并抛出异常
ThreadPoolExecutor.DiscardPolicy
// 丢弃任务
ThreadPoolExecutor.DiscardOldestPolicy
// 丢弃最老任务
ThreadPoolExecutor.CallerRunsPolicy
// 调用者线程执行任务
29、被线程池拒绝的用户令牌是否有效?
无效。
对应 Token 会从 Redis 中删除。
30、线程池阻塞队列大小如何设置?
通常设置为:
秒杀商品数量 - 核心线程数
31、线上查看 JVM GC 情况命令
jstat -gc vmid count
jstat -gc 12538 5000
表示每 5 秒打印一次指定 Java 进程的 GC 情况。
32、项目预期
用于深入理解高并发、缓存、消息队列、分布式事务等核心技术。
33、秒杀令牌每秒生成多少个?
令牌数量会动态变化。
通常通过令牌桶算法控制生成速率。
34、MQ 异步扣减库存流程
- Redis 扣减库存成功。
- 生成包含商品和用户信息的消息。
- MQ 发送消息。
- 订单服务消费消息。
- 生成订单。
- 更新 MySQL 库存。
35、项目性能指标
- TPS:单机约 2000
- QPS:未记录
36、MySQL 表设计
- item 商品表
- item_stock 库存表
- order 订单表
- user 用户表
37、多人协作如何协调?
可采用 Git Flow、接口文档管理、代码评审等方式进行协作开发。
38、只使用 MySQL 如何防止超卖?
将查询库存和扣减库存放入同一个事务中执行。
虽然能够保证正确性,但并发能力较弱。
39、数据库扣减库存 SQL
update table
set stock = stock - 1
where prom_id = ?
and stock > 1;
40、如何防止用户反复点击下单按钮?
前端方案
- 点击后按钮置灰
- 限制重复点击时间
后端方案
- 秒杀令牌校验
- Redis 去重
- 重复请求直接返回“正在抢购中”
相关文章
-
什么是流量削峰?高并发系统中的核心保护机制详解
在互联网系统中,绝大部分时间系统流量都处于平稳状态,但在某些特殊场景下会突然出现流量激增。例如秒杀活动、双十一购物节、春节红包雨、明星直播带货、热门新闻发布等场景,大量用户会在极短时间内同时访问系统。在互联网系统中,绝大部分时间系统流量都处于平稳状态,但在某些特殊场景下会突然出现流量激增。例如秒杀活动、双十一购物节、春节红包雨、明星直播带货、热门新闻发布等场景,大量用户会在极短时间内同时访问系统。
NEW个对象 2026-06-12
-
与第三方接口对接的注意事项与实现方案
在现代分布式系统与微服务架构中,系统之间的能力复用越来越依赖第三方接口(支付、短信、地图、风控、物流等)。
NEW个对象 2026-06-08
-
AI 自动化研发 Prompt 流程设计
如果按照标准化研发流程推进,建议将 Prompt 固化为多个阶段,而不是每次重新编写。 通过将需求分析、数据库设计、代码生成、代码审查和自动测试拆分为独立阶段,可以形成完整的 AI 自动化研发链路。
NEW个对象 2026-06-12