从压缩列表到字典的完美平衡
2010 年,Hash 类型诞生。采用 ziplist(压缩列表)作为底层实现, field-value 对连续存储,内存紧凑。
开始引入 dict 字典结构,为后续编码转换做准备。 Hash 增长超过阈值时开始考虑字典实现。
引入完整的编码转换机制。当 Hash 字段数小于 hash-max-ziplist-entries(512) 且每个 field/value 长度小于 hash-max-ziplist-value(64字节)时使用 ziplist, 否则转换为 dict。
引入渐进式 rehash 机制。当 dict 需要扩容/缩容时, 分多次完成,避免一次性大内存迁移导致的阻塞。
优化 hash-max-ziplist-entries 默认值从 512 → 1000, hash-max-ziplist-value 从 64 → 512 字节。 适应更复杂的应用场景。
Redis 7.0 将 Hash 的 ziplist 替换为 listpack。 listpack 是 ziplist 的改进版,解决了 ziplist 级联更新问题。
Redis 根据数据量自动选择最优编码,平衡内存与性能
Redis Hash 从最初单一的 ziplist 实现,演变为智能的双编码系统:
ziplist/listpack →
自动转换 →
dict
核心优化路径:
小数据省内存(紧凑存储)|
大数据保性能(O(1)查询)|
渐进式扩容(零阻塞)
这套"自动档"编码切换机制,让 Redis Hash 能够在不同数据规模下都保持最优表现。