快手27暑期AI后端开发一面面经

快手 · AI后端开发 · 一面 · 2026-04

面试题目

  1. 项目拷打
  2. 预减库存时如何保证 Redis 和 MySQL 的数据一致性?
  3. ShardingJDBC 底层是怎么实现分库分表的?在什么情况下需要做分库分表,拆表后关联查询的效率如何保证?
  4. 订单分页怎么做?涉及多张表联查时如何处理?
  5. Spring Event 的原理是什么?如何实现异步监听机制?
  6. Redis 的 RDB 和 AOF 两种持久化机制有什么区别?AOF 里记录的是什么内容?
  7. MySQL B+ 树底层存储结构是什么样的?聚簇索引和二级索引有什么区别?
  8. ConcurrentHashMap 底层原理是什么?为什么既用 CAS 又用 synchronized?
  9. Java 线程有哪些生命周期状态?对应 Thread 类里如何流转?
  10. 线程池底层实现原理大概是什么?
  11. 如何设计一个压测方案,对比加缓存和不加缓存的性能差异?
  12. 算法题:有序链表中删除所有重复节点(时间复杂度O(n),空间复杂度O(1)),设置虚拟头节点的好处是什么?

参考解析

  • Redis/MySQL一致性:推荐采用“先更新数据库,后删除缓存”策略,配合延时双删或订阅Binlog(如Canal)实现最终一致性。
  • 分库分表:通过ShardingJDBC的SQL解析和路由引擎实现。拆表后联查尽量通过字段冗余或业务端二次查询处理,避免跨库JOIN。
  • Spring Event:基于观察者模式,通过ApplicationEventPublisher发布事件。通过@Async注解开启异步监听,底层利用任务执行器处理事件。
  • ConcurrentHashMap:JDK 1.8采用数组+链表+红黑树,使用CAS保障Node插入及头节点更新,synchronized仅锁住每个链表的头节点,实现精细化并发控制。
  • 线程池原理:基于ThreadPoolExecutor,当任务数超过核心线程数时进入工作队列,队列满后扩容至最大线程数,超出后触发拒绝策略(如AbortPolicy)。
  • B+树索引:聚簇索引叶子节点存储整行数据,二级索引叶子节点存储主键值。通过B+树降低树高,减少磁盘IO次数。
  • 有序链表去重:使用虚拟头节点(Dummy Head)可统一处理头节点被删除的特殊情况,避免额外分支判断,简化代码逻辑。