Redis Hash 数据结构实现详解(基于 6.0.10 版本)
Redis 中的 Hash 类型(哈希表)是一种键值对集合,底层采用混合编码策略(ziplist 或 hash table),兼顾内存效率和操作性能。本文结合源码结构,详解其实现机制、编码转换、哈希冲突处理及扩容策略。
Hash 类型的编码策略
Redis 的 Hash 类型根据数据规模自动选择两种编码方式,通过配置参数控制转换阈值:
| 编码方式 | 适用场景 | 转换条件(满足任一即触发) |
|---|---|---|
OBJ_ENCODING_ZIPLIST(压缩列表) |
元素少且小(键值均为短字符串) | 1. 元素数量 > hash-max-ziplist-entries(默认 512) 2. 任一键 / 值长度 > hash-max-ziplist-value(默认 64 字节) |
OBJ_ENCODING_HT(哈希表) |
元素多或大(键值为长字符串 / 整数) | 上述条件触发后,自动转为哈希表编码 |
两种编码的权衡:
- ziplist:连续内存存储,无哈希表元数据开销,内存紧凑(适合小数据),但插入 / 删除需移动元素(O (N) 时间复杂度)。
- hash table:哈希表结构,插入 / 删除 / 查询平均 O (1) 时间复杂度(适合大数据),但内存开销较高(需存储指针和哈希表结构)。
哈希表核心源码结构
当 Hash 类型采用 OBJ_ENCODING_HT 编码时,底层依赖 dict(字典)结构体实现,源码如下:
1. dict(字典)
1 | typedef struct dict { |
- 核心作用:管理哈希表的生命周期(创建、插入、查询、扩容等),通过
ht[0]和ht[1]实现动态扩容。