面灵AI

美团后端开发岗面经(05)

时间
2026-09
来源
牛客网

《面试题目》

  1. Redis 常用数据结构有哪些,在项目中分别如何使用?
  2. Redis 分布式锁的原理是什么,使用时可能遇到哪些问题?
  3. Redis 缓存与 MySQL 的数据一致性如何保证?
  4. 分库分表后遇到跨库查询应该怎么解决?
  5. 消息队列如何保证消费有序?
  6. JVM 内存结构和常见垃圾回收器分别是什么?
  7. 遇到 Full GC 或内存泄漏时如何排查和处理?
  8. MySQL 的事务特性和隔离级别如何实现?
  9. 千万级数据表的 CRUD 变慢时如何优化?
  10. Spring 如何解决 Bean 循环依赖?
  11. 输入一个 URL 到页面加载完成经历了哪些过程?
  12. HTTP/1.0、HTTP/1.1 和 HTTP/2 有哪些区别?

《参考解析》

  1. Redis 的 String、Hash、List、Set、ZSet 分别适合缓存对象、计数、队列、去重和排序等场景。选择结构时应结合访问模式与原子操作需求,避免把所有数据都编码成字符串。
  2. 分布式锁通常用带唯一令牌的 SET key value NX EX 获取,释放时用 Lua 校验令牌后删除。还要处理超时、续期、锁粒度和 Redis 故障,不能直接按 key 删除。
  3. 常见做法是先提交数据库更新,再删除缓存;对并发读写可加延时双删、版本号或 Binlog 订阅重建。缓存更新失败必须有重试或补偿,否则只能保证最终不一致。
  4. 分库分表后应优先让查询带分片键;确需跨库时可通过汇总表、冗余索引、并行查询后合并或搜索系统承接,避免无边界的全分片广播。
  5. 同一业务键固定路由到同一分区,并由单分区内的消费者顺序处理;重试和扩容时仍需保证幂等,不能只依赖消费者恰好单线程。
  6. JVM 运行时主要包括堆、虚拟机栈、程序计数器和元空间。G1 适合可控停顿的较大堆,CMS 已逐步淘汰;选择回收器要结合堆大小、吞吐量和停顿目标。
  7. 先用 GC 日志、堆转储和 MAT 定位大对象、引用链及晋升压力,再从对象生命周期、缓存上限和线程数量修复。不能只调大堆或提高 Full GC 频率。
  8. 事务通过 Undo Log、Redo Log、锁和 MVCC 提供原子性、持久性与隔离性。隔离级别越高并发读写限制越多,应按脏读、不可重复读和幻读的业务容忍度选择。
  9. 先用慢查询日志和执行计划定位问题,再检查索引、回表、分页方式、数据归档和读写分离;避免一次性扫描或返回海量行。
  10. Spring 通过三级缓存提前暴露单例工厂对象,让属性注入形成的环依赖可以解析;构造器环依赖无法靠该机制解决,应拆分职责或改为延迟获取。
  11. 浏览器先解析 URL、DNS、建立 TCP/TLS 连接并发送 HTTP 请求,服务端返回资源后浏览器解析 HTML、CSS、脚本并布局绘制。缓存、连接复用和并行请求会改变具体耗时。
  12. HTTP/1.0 默认短连接,1.1 支持持久连接和分块传输但存在队头阻塞,HTTP/2 通过二进制分帧、多路复用和头部压缩改善并发传输。