小米后端Java一面面经(26春招)
《面试题目》
一、项目与实习经历
- 自我介绍:学校、专业、成绩、技术特点、实习及项目经历。
- 实习项目:目标用户群体、技术架构。
- 为什么使用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注入的循环依赖。通过三级缓存机制:一级单例池、二级早期对象池、三级工厂方法池,在实例化后、初始化前暴露早期引用解决。