字节跳动后端开发面经(已获Offer)
面试题目
一面 (50min)
- 数据一致性保证:多机房多集群下Redis限流实现。
- 乐观锁和悲观锁的区别。
- AOP底层原理。
- 如何解决Redis大key和热key问题。
- Spring Bean初始化流程。
- Spring如何解决循环依赖。
- HTTP请求从浏览器到服务器的全过程。
- HTTP和HTTPS区别。
- 公钥与私钥的概念。 手撕:LCR 194 二叉树的最近公共祖先。
二面 (1h)
- 项目:Redis防止超卖与数据库关系。
- 定时任务宕机丢失方案。
- 项目中缓存击穿场景。
- 订单系统设计:索引设计、分库分表方案、慢查询优化、Explain分析。
- Redis:常用数据结构、Zset底层实现、主从复制。
- RabbitMQ:消息不丢失方案(生产/消费)、消费顺序保证。
- HashMap底层实现及哈希冲突处理。
- 线程池原理及优势。 手撕:LCR 023 相交链表。
三面 (40min)
- ConcurrentHashMap底层原理。
- 缓存过期时间设置策略。
- 使用本地缓存的原因。 手撕:LCR 095 最长公共子序列(变种:输出序列)。
HR面 (20min)
常规业务与个人情况沟通。
参考解析
- Redis大Key/热Key:大Key通过拆分、压缩或异步删除解决;热Key通过本地缓存(如Guava/Caffeine)、读写分离或分片存储处理。
- Spring循环依赖:通过三级缓存机制解决,即单例对象在构造后立即放入缓存,允许在初始化完成前注入引用。
- MySQL分库分表:垂直拆分基于业务模块,水平拆分基于关键字段(如订单ID)取模,需注意分布式事务与跨库聚合查询的代价。
- RabbitMQ可靠性:生产端使用Confirm机制确认投递;消费端通过ACK确认机制保证处理完成;顺序消费通过单个队列或分片Key映射到固定消费者实现。
- ConcurrentHashMap:采用分段锁(JDK 7)或 CAS+synchronized(JDK 8+)实现,确保高并发下的线程安全与高性能读写。