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