快手 AI 全栈二面凉经
- 轮次
- 二面
- 时间
- 2026-09
- 来源
- 牛客网
《面试题目》
- 项目
@Transactional相关注解参数、失效时机等- MySQL 隔离级别可重复读,解决部分幻读之类的
- Redis 大 key 定义、解决
- MySQL 主从相关的东西
- 后面都问了啥忘了(作者注:Go 八股没背,只能硬着头皮回忆 Java 八股)
- 最后 AI Coding 是给你一个很简短的题目和几个最基础的功能,让你在产品视角上落地这个产品,配合 AI 制定要实现哪些功能,并实现和测试
《参考解析》
@Transactional的失效时机:rollbackFor决定哪些异常触发回滚,默认只认RuntimeException和Error,抛受检异常必须显式声明;propagation决定事务怎么传播,REQUIRES_NEW会挂起外层事务开新事务,NOT_SUPPORTED直接不参与事务;readOnly影响的是驱动层的优化提示,不是强制约束;timeout超时会抛异常并回滚。失效场景主要是代理没生效(同类自调用、非 public 方法、final方法)和异常被吞掉。另外注意@Transactional与synchronized一起用时,锁的释放早于事务提交,可能出现「锁内查不到、锁外已提交」的问题。- 可重复读与幻读:InnoDB 的 RR 用 MVCC 保证普通一致性读在整个事务里看到同一个快照,因此不会出现不可重复读;幻读在「快照读」下也基本被消除。但在「当前读」(
select ... for update、update、delete)时仍需靠 Next-Key Lock(记录锁 + 间隙锁)来阻止其他事务在区间内插入,这才是 RR 下幻读被「部分解决」的原因。要区分快照读和当前读来回答,比笼统说「RR 解决了幻读」准确得多。 - Redis 大 key:一般按「value 超过 10KB」或「集合类元素超过 5000 个」这类经验阈值来判断,也可以直接
redis-cli --bigkeys或分析 RDB 得到实际分布。危害是单次操作阻塞主线程、网络带宽被打满、集群下分片倾斜、删除时同步释放内存造成卡顿。处理方式:拆分(按业务维度分成多个 key)、用HSCAN/SSCAN分批遍历、删除时用UNLINK异步回收;设计阶段就要给 key 设 TTL 和容量上限,避免无限增长。 - MySQL 主从:主库把变更写进 binlog,从库的 IO 线程拉取并写入 relay log,SQL 线程重放,实现异步复制;半同步复制要求至少一个从库确认收到才算提交,牺牲一点延迟换更低的数据丢失风险。典型问题是主从延迟,读写分离下会读到旧数据,缓解手段有强制走主库读、
semi-sync、并行复制、以及把大事务拆小。回答时最好补一句:延迟监控和「哪些读可以容忍旧数据」的白名单机制,比单纯调参数更重要。 - AI Coding 场景题怎么答:别一上来就写代码,先把「谁在用、核心场景是什么、这一版必须有的功能是哪几个」讲清楚,再让 AI 生成实现,最后补上测试和边界。面试官看的通常不是最终代码量,而是你有没有产品判断——能不能砍功能、能不能说清验收标准、会不会对 AI 产出做验证。