Redis zset 的底层数据结构及常用API

底层数据结构

在最新的 Redis(特别是 7.0+ 版本)中,zset(有序集合)是一个非常有意思的设计,它为了平衡 “查询速度” 和“内存消耗”,采用了双重底层的物理结构。简单来说,ZSet 是由 listpack 进化为跳表(skiplist)+ 字典(dict) 的过程。


Redis set 的底层数据结构及常用API

数据结构

在最新的 Redis(特别是 Redis 7.2 及以后版本)中,Set 对象的物理存储结构经历了重要的升级。为了平衡 “内存效率” 和 “查询性能”,Redis 会根据数据内容自动在三种底层结构间切换。我们可以把 Redis Set 想象成一个智能收纳盒,它会根据你放进去的东西自动变换形态。


Redis list 数据结构和典型API

数据结构

list 的底层实现——quicklist

底层结构quicklist(快速列表)

  • 当前结构:在最新的 Redis(Redis 7.0 及以后版本)中,对象的底层物理存储结构已经全面进化为 quicklist。quicklist 是一个双向链表,每个节点都是一个 listpack(在旧版本中是 ziplist)。它结合了链表修改快的优点和数组内存紧凑、利用率高的优点。

    1
    Redis List = 外层双向链表(保证扩展性) + 内层 listpack(保证内存紧凑和避免连锁更新)。
  • 数据特点:

    • 如果你想用 List 实现堆栈 (Stack),只需遵循 “同进同出”(例如 lpush + lpop);
    • 如果你想实现队列 (Queue),只需遵循 “异进异出”(例如 lpush + rpop)。


Redis hash 底层数据结构及常用API

Hash 介绍

数据结构

hash的优点是比 string 更节省内存,原因是最新的hash底层结构是 listpack(压缩列表)或 hashtable(dict)(哈希表)。当字段较少且值较小时,使用内存极其紧凑的 listpack;当数据量增大时,自动转为 hashtable 以保证 $O(1)$ 的查询效率。当你创建一个小的 Hash 时,它在物理内存上是一块完全连续的字节数组,它不像传统的键值对那样通过指针连接,而是把 Field 和 Value 像排队一样交叉存储。

Redis string 底层数据结构以及典型的API

数据结构

底层结构 redisObject + SDS 的介绍