荣耀Java开发实习生一面面经
《面试题目》
开场
- 自我介绍
研究方向 2. 介绍下你的研究方向这块
实习 3. 实习做了哪些工作 4. 系统的数据来源 5. 系统这些数据量大不大,用什么存储的 6. 慢查询排查优化完整流程讲一下 7. MySQL数据量情况,如何优化 8. Caffeine参数设置及命中率保证 9. Caffeine命中率统计过吗 10. 如何保证Caffeine命中率 11. Redisson分布式锁解决缓存击穿的场景 12. 没拿到Redisson分布式锁的线程处理逻辑 13. Caffeine+Redis+数据库三级缓存下的缓存击穿解决策略
项目(AI项目 & 点评系统) 14. 项目背景介绍(开源/真实) 15. 召回率、准确率测量 16. 项目优化点 17. 滑动窗口限流用Redis什么结构、key设置、参数配置 18. 高并发下限流方案的可行性及优化 19. 压力测试经历 20. Redis部署模式(单体/集群) 21. Lua脚本中key的构成
八股文 22. 常见限流算法及Lua脚本原子性 23. Kafka Rebalance场景、分区与消费者关系 24. Kafka重复消费与堆积的解决方法 25. 线程与进程区别 26. InnoDB默认隔离级别、解决的问题及如何防止幻读 27. 事务四大特性(ACID) 28. Spring循环依赖解决方式 29. ArrayList线程安全性及List集合选择 30. ConcurrentHashMap线程安全实现 31. final关键字的作用 32. synchronized与ReentrantLock区别 33. 垃圾回收机制及OOM排查与MAT使用 34. Redis数据结构及其底层实现 35. Redis过期删除与内存淘汰策略
《参考解析》
- 慢查询排查:通过EXPLAIN查看执行计划,分析type、key、rows等字段,定位是否走索引;检查是否发生全表扫描,通过添加复合索引或优化SQL语句解决。
- 三级缓存击穿:当热点Key失效,请求直达DB。解决方案:使用分布式锁(互斥锁)仅允许一个请求回源DB,其余请求重试或返回空;或使用逻辑过期方案,更新前不清理缓存。
- Kafka重复消费:根本原因是ACK机制或网络抖动,解决办法是利用唯一ID在业务侧进行“幂等处理”(如存入Redis或数据库主键冲突)。
- Spring循环依赖:通过三级缓存机制解决,主要依赖提前暴露对象引用(早期单例工厂)来解决Setter注入导致的循环依赖。
- InnoDB幻读:在可重复读(RR)级别下,通过Next-Key Lock(记录锁+间隙锁)在锁定行范围的同时锁定间隙,防止其他事务插入数据。