腾讯后台开发二面面经
面试题目
一、算法题
- LRU缓存变种:在LRU基础上增加访问次数阈值k,达到阈值才进入LRU淘汰机制。
- LeetCode 56 合并区间:需先排序,考察区间合并逻辑及自定义排序函数。
二、八股文
- 消息队列:RabbitMQ/RocketMQ与Kafka选型对比,Kafka丢数据场景分析。
- 微服务:对比单体架构的优劣势。
- 分布式事务:2PC与3PC的区别。
- 数据库与缓存:MySQL、Hive、Redis应用场景对比。
- 搜索引擎:ES倒排索引原理。
- 数据同步:Hive到MQ同步方案中引入MQ的必要性。
- MySQL:Binlog机制、全量与增量同步区别、事务特性(ACID)及实现、Redo/Undo log作用、隔离级别实现(MVCC/间隙锁)、索引结构(B+树/B树/红黑树/Hash)、覆盖索引。
- Redis:哨兵模式与集群架构。
- 框架原理:Spring Boot加载外部库机制(类加载器)。
- 语言对比:Java、Python、C++、PHP的差异。
三、项目经历
- 项目中的挑战及深刻记忆。
参考解析
-
Kafka丢数据场景:通常发生在异步刷盘时机器宕机,或副本同步机制设置不当(如acks=1或0)。建议理解ISR机制及如何通过配置(acks=all, min.insync.replicas)保障一致性。
-
MySQL事务隔离级别:读未提交、读已提交、可重复读(RR)、串行化。RR级别主要通过MVCC(多版本并发控制)加行锁实现,其中MVCC通过隐藏字段(trx_id, roll_pointer)和ReadView实现快照读。
-
B+树优势:相比B树,B+树非叶子节点不存数据,磁盘IO更少,叶子节点有序链表结构非常适合范围查询。相比红黑树,B+树高度更低,更适应磁盘存储特性。
-
覆盖索引:指索引中包含了所有需要查询的字段,无需回表查询聚簇索引,能显著提升查询效率。判断方法即Explain执行计划中Extra列是否显示“Using index”。
-
Spring Boot类加载:Spring Boot通过自定义的
LaunchedURLClassLoader处理嵌套JAR文件(Fat JAR),利用JarLauncher解析BOOT-INF/lib下的依赖并加载。