字节跳动高并发中间件后端面经
- 轮次
- 一面
- 时间
- 2026-09
- 来源
- 牛客网
《面试题目》
- Spring Boot 自动配置的启动流程是什么?
- Spring MVC 如何处理一次 HTTP 请求?
- MySQL 的事务隔离级别如何通过 MVCC 和锁实现?
- Redo log、Binlog、Undo log 各自有什么作用,两阶段提交为何必要?
- MySQL 为什么使用 B+ 树索引,最左匹配原则是什么?
- Redis 单线程为何仍能支撑高并发,I/O 多路复用如何工作?
- Redis 的 RDB 与 AOF 如何选择,怎样保证持久化可靠性?
- 缓存击穿、穿透和雪崩分别如何处理?
- Redis Cluster 如何进行 slot 分配和水平扩展?
- 如何实现线程安全的 LRU 缓存?
- 高并发接口如何保证幂等?
- 微服务间分布式事务有哪些解决方案?
- 线上 OOM 如何定位和优化?
- 配置中心动态刷新如何保证优先级和一致性?
《参考解析》
- Spring Boot 通过启动类和自动配置导入候选配置,结合条件注解、环境属性和 Bean 后置处理器完成容器装配;MVC 请求依次经过 DispatcherServlet、映射器、适配器、控制器和消息转换器。
- Undo log 支持回滚与一致性读,Redo log 保证崩溃恢复,Binlog 记录逻辑变更供复制和恢复使用。两阶段提交让 InnoDB 与 Binlog 对同一事务的提交状态保持一致。
- B+ 树非叶节点只存键和指针,树高低且叶子有序,适合范围扫描;联合索引从最左列开始连续使用,遇到范围条件后后续列通常不能继续用于定位。
- Redis 主线程执行命令,网络事件由 I/O 多路复用器批量就绪后处理,避免每个连接创建线程的切换成本。RDB 适合快速恢复,AOF 更接近实时,生产上可组合使用并明确 fsync 策略。
- 热点 key 可用互斥重建、逻辑过期或请求合并;穿透用空值或布隆过滤器;雪崩通过随机 TTL、分批失效和限流降级缓解。Cluster 按 slot 将 key 分布到分片,扩容时迁移 slot 并更新拓扑。
- 线程安全 LRU 通常以哈希表加双向链表实现 O(1) 访问和淘汰,再用锁或分段并发控制保护复合操作。接口幂等需要业务唯一键、状态机和唯一约束共同兜底。
- 分布式事务可按业务选择 TCC、Saga 或可靠消息最终一致性;不能只依赖本地事务。OOM 先结合 GC 日志、堆转储和 MAT 找到大对象或泄漏引用,再从集合生命周期、缓存和线程数入手修复。