小米后端Java一面面经(26春招)

小米 · 后端开发工程师 · 一面 · 2026-03

《面试题目》

一、项目与实习经历

  • 自我介绍:学校、专业、成绩、技术特点、实习及项目经历。
  • 实习项目:目标用户群体、技术架构。
  • 为什么使用Redis实现消息队列而非RocketMQ?(答:为了快速上线)
  • Redis与RocketMQ的区别?如果Redis消息丢失如何兜底?
  • 高并发场景下,应对数据读压力大的方案(缓存/WebSocket)。

二、基础知识

  • Redis热Key问题及其影响。
  • 布隆过滤器原理及其准确性(存在/不存在判断)。
  • MySQL MVCC原理(隐藏字段、undo log、Read View)。
  • Spring如何解决循环依赖?

三、软技能与AI工具

  • 公司如何使用AI、如何保证AI代码规范、对SDD(规范驱动开发)的了解。
  • 提交代码中AI占比及未使用AI的原因。
  • 公司常用AI模型。

四、反问

  • 技术挑战、业务领域。

五、算法

  • 最少会议室(最小堆实现)。
  • 最少奶茶钱(动态规划)。

《参考解析》

1. Redis与RocketMQ的区别: RocketMQ提供高可靠性、事务消息及持久化保证;Redis作为队列主要追求吞吐量和轻量级。兜底方案:利用脚本定时扫描数据库状态,重试失败或未消费的任务。

2. 热Key问题: 指某一个Key的访问频率过高,导致单机负载过高或带宽打满。解决方案:使用本地缓存(Local Cache)、Key热点打散、或者集群分片存储。

3. 布隆过滤器: 存在一定误判率。若判断“存在”,可能存在;若判断“不存在”,则一定不存在。原理:利用位数组和多个哈希函数映射。

4. MySQL MVCC: 通过隐藏字段(DB_TRX_ID, DB_ROLL_PTR)和Undo Log形成版本链,结合Read View判断当前事务能看到哪个版本的数据,实现非锁定读。

5. Spring循环依赖: 仅支持Setter注入的循环依赖。通过三级缓存机制:一级单例池、二级早期对象池、三级工厂方法池,在实例化后、初始化前暴露早期引用解决。