快手Java后端二面面经
面试题目
- 数据库从建立连接开始,如何保证稳定性和性能?
- Redis丢数据怎么办?(需从主从复制和AOF刷盘角度回答)
- Lua在实现分布式锁时比SETNX的优点是什么?
- 补充考点:Redis底层数据结构(面试官指出非完全基于跳表实现)。
- 手撕算法:在一个有序数组中(0到n-1,缺一个数字),找出缺失的数字(要求二分法实现)。
参考解析
-
数据库稳定性与性能:需回答连接池配置(HikariCP参数)、慢查询优化、索引命中率、读写分离、分库分表及数据库连接超时重试机制。
-
Redis数据丢失:主从复制异步延迟会导致从库丢失数据;AOF刷盘策略(everysec/always/no)决定了宕机时丢失数据的窗口期。建议结合Redis Sentinel或Cluster架构以及同步复制策略回答。
-
Lua脚本实现分布式锁:Lua脚本保证了多条命令执行的原子性。相比纯SETNX,Lua可以将“判断+获取”或“解锁时判断所属权+删除”封装成一个原子操作,避免并发环境下的非原子性逻辑错误。
-
Redis底层结构:Redis不同类型使用不同结构,如String用SDS,List用QuickList,ZSet在元素较少时用ZipList,较多时才用SkipList(跳表),并非完全基于跳表。