Redis 内存优化深度解析
候选人小张在字节 P6 面试中,面试官问:
"Redis 是怎么存储数据的?为什么有时候一个很小的值也占用很多内存?"
小张说:"Redis 内存占用和 value 大小有关?"
面试官追问:"那你知道什么是压缩列表吗?什么情况下 Redis 会选择压缩列表?"
小张答不上来了。
【面试官心理】 这道题我用来测试候选人对 Redis 内存优化的理解深度。能说出压缩列表的占 20%,能讲清底层数据结构的占 10%。
一、Redis 内存使用 🔴
1.1 Redis 内存组成
1.2 查看内存使用
二、底层数据结构 🔴
2.1 Redis Object 结构
2.2 编码类型
三、压缩列表(ziplist)🔴
3.1 什么是压缩列表
压缩列表是 Redis 为了节省内存设计的一种紧凑数据结构。
3.2 压缩列表节点
3.3 压缩列表的条件
3.4 压缩列表的优缺点
四、整数集合(intset)🔴
4.1 整数集合结构
4.2 整数集合的特点
五、quicklist(3.2+)🟡
5.1 quicklist 的设计
quicklist 是 linkedlist 和 ziplist 的结合:
- 每个节点是一个 ziplist
- 保留了 linkedlist 的快速插入/删除
- 保留了 ziplist 的紧凑内存
5.2 quicklist 配置
六、内存优化策略 🟡
6.1 字符串优化
6.2 内存碎片
6.3 小数据优化
七、生产避坑 🟡
7.1 大 Key 问题
7.2 内存上限
💡
生产环境中,建议设置 maxmemory 并配置合理的淘汰策略,防止 Redis 内存无限增长导致 OOM。
【面试官心理】 能说出"ziplist 转换条件"和"quicklist 设计"的候选人,基本都有深入学习过 Redis 源码。这是 P7 的水准。