携程Java开发二面面经
《面试题目》
- 自我介绍
- 介绍实习项目
- 为什么使用ES存储日志,有做过别的方案和调研吗
- 有了解过别的存储媒介吗(追问ClickHouse优缺点)
- 监控告警是如何生成告警的(基于Alertmanager)
- 告警异常数据分为什么类型,如何监控(Prometheus自监控与自定义Exporter)
- 多线程使用场景
- 线程池核心参数设置及依据
- 线程池参数的评估方案(基于CPU核数等硬件性能)
- 线程池完整的处理流程
- 索引的数据结构
- B+树、B树、红黑树区别
- 分库分表实现逻辑
- 状态机
- Redis缓存与分布式锁应用
- Redis与MySQL数据一致性解决方案
- Redis内存淘汰策略
- 分布式锁实现原理
- 消息队列如何保障消息不丢失(生产者与消费者端)
- JDK版本及JDK 21相较于1.8的新特性
- 常见GC算法
手撕代码:
- 给定一个已经排序的数字数组和两个整数k、x,在数组中找到k个最接近x的数字(要求二分法与双指针实现)。
《参考解析》
- Redis与MySQL一致性: 常见策略有更新数据库后删除缓存、延迟双删或使用Canal监听Binlog进行异步更新。核心是保证最终一致性,避免脏数据。
- 线程池参数设置: 核心线程数与最大线程数依据任务类型设置,CPU密集型设为N+1,IO密集型设为2N+1(N为CPU核数),需结合压测结果调整。
- 消息队列不丢失: 生产者端使用ACK确认机制+消息重发;MQ服务器端开启持久化;消费者端开启手动ACK,处理完成后再确认,确保消息被成功处理。
- B+树与索引: B+树适合磁盘存储,非叶子节点只存索引,叶子节点存数据且有双向链表,区间查找效率高。对比红黑树(适合内存查找,如HashMap)和B树(所有节点存数据,查找开销不稳定)。
- JDK 21新特性: 虚拟线程(Virtual Threads)极大地提升了高并发IO场景下的吞吐量,增强了模式匹配(Pattern Matching)和结构化并发能力。