Blog

Agility6

Redis的数据结构

Tech

本篇文章主要介绍Redis数据类型,具体实现的数据结构

前言

🚀 内容来自参考自Redis设计与实现

⚠️ 本篇文章主要介绍Redis3.0的数据结构,在Redis7.0数据类型与数据结构的关系有所不一致。 photo

介绍逻辑

  1. 数据结构的定义
  2. 字段的解释
  3. 特性

介绍内容

  1. 简单动态字符串
  2. 链表
  3. 字典
  4. 跳跃表
  5. 整数集合
  6. 压缩列表

简单动态字符串

数据结构的定义

photo

字段的解释

  1. free属性的值,记录SDS存在多少未使用的空间
  2. len属性,记录SDS保存多少字节长度的字符串

特性

  1. 常数复杂度获取字符串长度

  2. 杜绝缓冲区溢出问题,SDS在执行修改增加操作的时候,API会检查是否满足要求,如果不满足会自动扩容

  3. 减少修改字符串时带来的内存重分配次数,空间预分配会额外分配空间、惰性空间释放在缩短操作时,利用free属性记录数量,等待使用。

链表

数据结构的定义

字段的解释

ListNode

  1. 前置节点
  2. 后置节点
  3. 节点的值

List

  1. head表头指针
  2. tail表尾指针
  3. len链表长度计数器
  4. dup函数用于复制链表节点所保存的值
  5. free函数用于释放链表节点所保存的值
  6. match函数用于对比链表节点所保存的值和另一个输入值是否相等

特性

  1. 双端、无环
  2. 多态:链表节点使用void*指针来保存节点值,并且可以通过list结构的dup、free、match三个属性为节点值设置类型特定函数,所以链表可以用于保存各种不同类型的值。

字典

数据结构的定义

字段的解释

哈希表

哈希表节点

字典

特性

  1. 解决键冲突,使用链地址法来解决冲突,简单来说就是利用哈希表节点中的next属性将冲突节点放到链表的表头位置

  2. rehash(重新散列),当哈希表保存的键值对数量太多或者太少时,程序需要对哈希表的大小进行相应的扩展或者收缩。

  3. 渐进式rehash,在进行渐进式rehash的时候,字典里面查找一个键的话,程序会先在ht[0]里面进行查找,如果没找到的话,就会继续到ht[1]里面进行查找。

跳跃表

数据结构的定义

字段的解释

zskiplist

zskiplistNode

特性

  1. 跳跃表中的节点按照分值进行排序,当分值相同时,节点按照成员对象的大小进行排序

整数集合

数据结构的定义

photo

字段的解释

特性

  1. 集合中不会出现重复元素
  2. 整数集合升级,发生在添加新元素的类型比原来的类型要大
    • 整数集合升级,提高整数集合的灵活性(C语言是静态类型语言,通常不会将两种类型的值放在同一个数据结构当中)
    • 整数集合升级,尽可能节约内存

压缩列表

数据结构的定义

photo

字段的解释

压缩列表的构成

压缩列表节点的构成

特性

  1. 连锁更新,previous_entry_length属性都记录了前一个节点的长度,因此可能会发现连锁更新(发生的几率不高)