腾讯音乐软件开发后台一面凉经

腾讯音乐 · 后台开发工程师 · 一面 · 2026-05

《面试题目》

  1. 项目的整体流程?现在的大模型已经能做到你项目的这个功能,为什么还要做这个项目?
  2. 平常用的多的 AI 工具有哪些,是怎么使用的?
  3. 项目中 Redis 是怎么用的,为什么要用 Redis?(谈到 JVM 内存溢出)
  4. 是哪里的内存会溢出,为什么会溢出?了解新生代和老年代吗?
  5. JDK21 用的垃圾回收算法是什么?
  6. 项目中用到虚拟线程,虚拟线程和普通线程的区别是?怎么创建虚拟线程?传统线程怎么创建?
  7. 怎么实现一个本地缓存?过期时间怎么判断?本地缓存和 Redis 怎么实现数据同步?
  8. Redis 的主从同步怎么实现?Redis 集群主节点故障时怎么做故障转移?从节点数量怎么设置?
  9. 怎么设计一个秒杀系统?怎么防止重复请求/重复订单?幂等怎么实现?
  10. 高并发场景下先写 MQ 再入库,异步链路下如何保证用户体验(及时反馈成功/失败)?

《参考解析》

  1. 虚拟线程 vs 传统线程:虚拟线程(Virtual Thread,JDK21 正式特性)由 JVM 而非操作系统调度,创建和切换成本极低(可轻松创建百万级),阻塞时会自动”卸载”底层的操作系统载体线程去执行其他虚拟线程,特别适合高并发 IO 密集型场景;传统线程直接映射到操作系统线程,创建和上下文切换成本高,数量受系统资源限制。创建方式上,传统线程用 new Thread() 或线程池,虚拟线程用 Thread.startVirtualThread()Executors.newVirtualThreadPerTaskExecutor()
  2. Redis 集群故障转移:Redis Cluster 或哨兵模式下,主节点故障时,从节点会发起选举(基于 Raft 类似的投票机制),获得多数从节点认可的候选者晋升为新主节点,客户端感知拓扑变化后重新定位新主节点;从节点数量通常建议至少配置1-2个,兼顾故障转移的可用性与资源成本。
  3. 秒杀系统的幂等与用户体验保障:幂等常用方案是数据库唯一约束(用户ID+活动ID)或提交前生成唯一请求令牌(Token机制);异步下单场景下,为保证用户体验,通常采用”先做前置校验+库存预占(如Redis原子扣减)快速给用户初步反馈,再通过MQ异步完成订单创建和数据库持久化,最终通过消息推送/轮询查询让用户获知最终结果”的两阶段模式,而不是让用户一直等待数据库链路完成。