首页 > 项目 > 当前页面

秒杀项目常见面试题

2026-06-12 NEW个对象

秒杀项目常见面试题

0、介绍一下你的项目

为什么做这个项目?

希望将过去所学的一些知识进行系统化的深入理解。秒杀项目应用场景丰富,涉及高并发、缓存、消息队列、分布式锁等多个中间件,更有利于对 Web 服务架构的深入学习。

项目整体流程

项目主要模拟高并发秒杀场景。请求到达 Nginx 后,通过负载均衡策略分发到后端两台服务器。

为解决秒杀场景中的入口流量和瞬时高并发问题,引入了 Redis 作为缓存中间件,实现缓存预热、库存预扣减等功能;通过秒杀令牌与秒杀大闸机制限制入口流量;通过线程池技术实现流量削峰,缓解系统瞬时压力。

1、秒杀中如何处理超卖问题?

仅依靠 MySQL 时,可以通过库存条件更新语句实现:

update table_prmo
set num = num - 1
where id = 1001
and num > 0;

更常见的方案是利用 Redis 单线程特性进行库存预扣减。

  1. 系统启动时,将商品库存预热到 Redis。
  2. 用户请求到达后,先在 Redis 中执行库存预减。
  3. 库存不足直接返回失败。
  4. 库存扣减成功后进入异步队列。
  5. 消费者生成订单并扣减数据库库存。
核心思想: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、秒杀系统架构设计

  1. Nginx 动静分离与负载均衡
  2. Redis 缓存预热与库存预减
  3. 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:拒绝策略

执行流程

  1. 优先创建核心线程。
  2. 核心线程满后进入阻塞队列。
  3. 阻塞队列满后创建非核心线程。
  4. 达到最大线程数后执行拒绝策略。

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 异步扣减库存流程

  1. Redis 扣减库存成功。
  2. 生成包含商品和用户信息的消息。
  3. MQ 发送消息。
  4. 订单服务消费消息。
  5. 生成订单。
  6. 更新 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

NEW个对象 NEW个对象
JAVA是世界上最好的语言