快手Java后端二面面经

快手 · Java后端开发 · 二面 · 2026-04

面试题目

  1. 数据库从建立连接开始,如何保证稳定性和性能?
  2. Redis丢数据怎么办?(需从主从复制和AOF刷盘角度回答)
  3. Lua在实现分布式锁时比SETNX的优点是什么?
  4. 补充考点:Redis底层数据结构(面试官指出非完全基于跳表实现)。
  5. 手撕算法:在一个有序数组中(0到n-1,缺一个数字),找出缺失的数字(要求二分法实现)。

参考解析

  1. 数据库稳定性与性能:需回答连接池配置(HikariCP参数)、慢查询优化、索引命中率、读写分离、分库分表及数据库连接超时重试机制。

  2. Redis数据丢失:主从复制异步延迟会导致从库丢失数据;AOF刷盘策略(everysec/always/no)决定了宕机时丢失数据的窗口期。建议结合Redis Sentinel或Cluster架构以及同步复制策略回答。

  3. Lua脚本实现分布式锁:Lua脚本保证了多条命令执行的原子性。相比纯SETNX,Lua可以将“判断+获取”或“解锁时判断所属权+删除”封装成一个原子操作,避免并发环境下的非原子性逻辑错误。

  4. Redis底层结构:Redis不同类型使用不同结构,如String用SDS,List用QuickList,ZSet在元素较少时用ZipList,较多时才用SkipList(跳表),并非完全基于跳表。