第3章:缓存基础知识面试题——数据结构、过期策略、持久化机制
本章是分布式缓存研发工程师面试的基石考点。面试官会从底层数据结构实现、过期删除策略、持久化机制三个维度考察你对缓存中间件的理解深度。掌握这些基础,才能在后续深入问答中展示扎实的内功。
面试问答卡片
面试问题:Redis 中常用的数据结构有哪些?请说明底层实现。
面试官考察点:是否理解每种数据结构的底层编码(SDS、压缩列表、跳表等),以及何时切换。
回答框架:列举 5 种 → 分别说明底层结构(如 String 用 SDS)→ 补充动态转换条件(如 Hash 何时用 ziplist)→ 说明适用场景。
示例回答:Redis 有 String、List、Hash、Set、ZSet。String 底层 SDS 保证二进制安全;List 用 quicklist(3.2+);Hash 元素少时用 ziplist,多时用 hashtable;Set 用 intset 或 hashtable;ZSet 用 ziplist 或 skiplist + hashtable。数据量增长时会自动转换。
可能追问:为什么 ZSet 同时用跳表和哈希表?压缩列表转 hashtable 的阈值是多少?
面试问题:Redis 的过期策略有哪些?如何选择?
面试官考察点:对主动/被动删除机制的理解,以及性能和内存的平衡。
回答框架:三种策略(定时、惰性、定期)→ 说明 Redis 采用惰性+定期组合 → 结合 maxmemory 淘汰策略说明完整方案。
示例回答:Redis 使用惰性删除(访问时检查)和定期删除(每 100ms 随机抽样检查)组合策略。惰性删除节省 CPU 但可能积累过期 key;定期删除控制内存但不会 100% 扫描。当内存超限时,配合 allkeys-lru 等淘汰策略,保证热点数据。
可能追问:定期删除每次扫描多少 key?如果大量 key 同时过期怎么处理?
面试问题:Redis 持久化机制 RDB 和 AOF 的区别及适用场景?
面试官考察点:对数据安全、性能、恢复速度的权衡理解。
回答框架:分别说明 RDB(快照)和 AOF(写日志)原理 → 对比优缺点 → 引入混合持久化 → 给出场景建议。
示例回答:RDB 通过 fork 子进程生成快照,文件小恢复快,但可能丢失最后一个快照后的数据。AOF 记录每次写操作,根据 fsync 策略(1s/每次写)保证数据,但文件大恢复慢。Redis 4.0 混合持久化:RDB 做全量,AOF 记录增量,兼顾速度与安全。关键业务推荐混合持久化。
可能追问:AOF 重写过程?同时开启 RDB 和 AOF 加载顺序?如何选择持久化方案?
知识结构表格
| 考点类别 | 子项 | 核心要点 | 面试高频坑 |
|---|---|---|---|
| 数据结构 | String | SDS,二进制安全,预分配 | 误以为 C 字符串 |
| List | quicklist(linkedlist + ziplist) | 仍说双向链表 | |
| ZSet | skiplist + hashtable | 忽视跳表实现细节 | |
| 过期策略 | 定时删除 | CPU 高,不实用 | 以为 Redis 采用此策略 |
| 惰性删除 | 访问时检测,内存浪费 | 忽略内存淘汰配合 | |
| 定期删除 | 随机抽样,平衡 CPU/内存 | 误以为全量扫描 | |
| 持久化机制 | RDB | fork 子进程快照,恢复快,可能丢数据 | 忽略 fork 对内存的影响 |
| AOF | 追加日志,三种 fsync 策略,重写机制 | 不区分 appendfsync 参数 |