虾皮 Java 开发工程师一面面经

虾皮 · Java · 一面 · 2026-04

面试题目

  1. 封装核心接口降低40%对接成本,之前有哪些因素会影响构建成功率?
  2. 构建混合检索引擎,为什么选择ES而不是其他向量数据库?你自己搭建过ES吗?
  3. 为什么用ES做全文搜索会比MySQL快?
  4. InnoDB底层数据结构是什么?为什么用B+树而不是B树或其它?
  5. PostgreSQL有哪些存储哲学?和MySQL的区别?
  6. 你的数据库支持哪些事务隔离级别?讲讲隔离级别。
  7. RR级别下如何避免幻读?实际编程中怎么处理?
  8. 你的数据库支持崩溃恢复吗?WAL怎么实现的?
  9. 如何将单机数据库改造成高可用集群?
  10. MySQL如何判断主从数据一致?支持恢复某个时间点吗?
  11. 你的社区项目怎么验证用户身份?只传用户ID怎么防止伪造?
  12. 发文章能发图片吗?怎么校验文件?
  13. Redis你用哪种模式?哨兵模式是什么?怎么故障转移?
  14. 讲一下RDB和AOF。如何将集群数据同步到另一个集群?
  15. 讲一下Java的GC算法。
  16. 讲一下TCP四次挥手,TIME_WAIT在哪个阶段?服务器上大量TIME_WAIT的原因?
  17. 手撕快速排序。
  18. 反问环节:部门业务、技术栈、AI使用情况、面试轮次、最需要提升的地方。

参考解析

  • MySQL B+树 vs B树:B+树非叶子节点不存数据,磁盘IO更少,叶子节点有序链表利于范围查询;B树节点即存索引也存数据,层级较多导致查询变慢。
  • RR级别避免幻读:通过MVCC(多版本并发控制)和Next-Key Lock(记录锁+间隙锁)解决。实际编程中建议使用乐观锁或业务层加锁机制。
  • TCP TIME_WAIT:处于主动关闭连接方,目的是确保对端收到ACK,防止延迟包干扰。大量出现通常是因为高并发短连接业务,建议开启tcp_tw_reuse或使用连接池。
  • Redis哨兵故障转移:哨兵定期监控集群状态,当Master宕机,通过投票机制选举一个Slave晋升为Master,并更新配置通知客户端。核心点在于选举算法(Raft协议变种)。
  • ES vs MySQL全文搜索:ES采用倒排索引(Inverted Index),将文档拆分词条与文档ID映射,查询复杂度接近O(1);MySQL使用B+树,对全文匹配需全表扫描或前缀匹配,无法高效处理语义和分词搜索。