Redis数据结构的底层实现
2025年Java面试宝典抢先领:
🔗 链接: https://pan.baidu.com/s/1RUVf75gmDVsg8MQp4yRChg?pwd=9b3g
提取码:9b3g(建议保存备用)

一、字符串底层:SDS结构
Redis的String类型不是直接用的C字符串,而是自研的SDS(Simple Dynamic String)。SDS有三大优势:
- O(1)获取长度:头部存了
len字段,直接取长度 - 避免缓冲区溢出:拼接前自动检查空间
- 减少内存重分配——通过预分配空间和惰性释放策略(比如修改后长度变短,不立刻缩容)
这种底层实现让Redis的字符串操作比原生C字符串高效得多,是数据结构设计的典型优化案例。
二、哈希表:渐进式rehash
Hash类型底层是字典(dict),核心是两张哈希表。为什么要两张?为了在扩容时平滑迁移:
- 触发扩容时(元素数 > 桶数),分配
ht[1](大小为ht[0]的2倍) - 渐进式迁移:每次增删改查迁移1个桶,避免单次卡顿
- 迁移完成后
ht[1]变ht[0]

三、列表:双向链表与压缩列表
List类型的底层实现分两种情况:
- 元素小且少时:用
ziplist(压缩列表)- 连续内存块,节省空间
- 每个节点记录前驱节点长度,支持双向遍历
- 元素大或多时:切到
quicklist- 本质是ziplist组成的双向链表
- 控制每个ziplist大小在8KB(默认值)
这种设计在内存效率和操作性能间取得平衡。
四、集合:哈希表与整数数组
Set类型的两种底层实现:
intset(整数集合):当元素全是整数且数量少时- 有序数组存储,二分查找
hashtable(哈希表):元素非整数或量大时- 哈希桶存储,value为
NULL
- 哈希桶存储,value为
这种数据结构的切换是自动触发的,开发者无感知。
五、有序集合:跳跃表+字典
ZSet是Redis最复杂的数据结构,组合使用:
skiplist(跳跃表):按分值排序,支持范围查询dict(字典):存储成员->分值映射,O(1)查分数

为什么用跳表不用红黑树?
- 实现更简单
- 范围查询效率更高(指针直接向后遍历)
- 并发场景更友好(红黑树需要全局锁)
💡 面试实战技巧
当面试官问“Redis的底层实现优化点”时,可以这样答:
“比如哈希表用渐进式rehash解决扩容卡顿问题,有序集合用跳表+字典的组合兼顾查询和范围操作。这种数据结构设计是Redis高性能的关键”
🚀 最后的小福利:
如果你需要购买面试鸭会员,通过 面试鸭返利网 找我下单可返利25元!省下的钱买杯咖啡继续刷题不香吗?
(本文技术解析由 面试鸭返利网 提供支持,助你高效备战面试)


