redis 跳跃表底层实现

Redis中的跳跃表(zset)是一种高效有序数据结构,由zskiplistNode和zskipList组成。节点通过多层前进指针加速访问,跨度记录相邻节点距离。节点包含分值和成员对象,按分值排序,分值相同则按对象排序。跳跃表层数随机介于1到32之间,允许相同分值但成员对象必须唯一。
摘要由CSDN通过智能技术生成

1 跳跃表

跳跃表是一种有序数据结构,它通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点。

跳跃表实现了有序集合键(zset)。

1.1 跳跃表的实现

redis 跳跃表是由zskiplistNode,zskipList。

zskiplistNode用于表示跳跃表节点,而zskiplist则用于保存跳跃表节点相关信息。

  • header:指向跳跃表的表头节点

  • tail:指向跳跃表表尾节点

  • level: 记录跳跃表,层数最大的节点层数

  • length: 记录跳跃表的长度,也就是跳跃表包含节点的数量

  • 层:节点中每个层都带有两个属性:前进指针和跨度。前进指针用于访问位于表尾方向的其他节点,而跨度则记录了前进指针所指向节点和当前节点的距离。

  • 后退指针:节点中用bw字样标记后退指针,用于在程序从表尾向表头遍历时使用。

  • 分值:节点中所保存的分值,在跳跃表中,节点按各自所保存的分值从小到大排列

  • 成员对象:各个节点中的o1等是节点所保存的成员对象

1.2 跳跃表节点
typedef struct zskiplistNode{
    // 后退指针
    struct zskiplistNode *backward;
    
    //分值
    double score;
    
    //成员对象
    robj *obj
        
    // 层
    struct zskipliatLevelP{
        // 前进指针
        struct zskiplistNode *forward;
        
        // 跨度
        unsigned int span;
        
        
    }level[];    
        
    
}zskiplistNode;
  • 层 : 跳跃表节点的level数组包含多个元素,每个元素指向其他节点,程序通过这些层加快访问其他节点的速度。

  • 前进指针:用于从表头访问表尾

  • 跨度:用于记录两个节点之间的距离

  • 后退指针:用于从表尾向表头方向访问节点,每次只能后退至前一个节点。

  • 分值和成员

    节点的分值(score)是double 类型数据。跳跃表中的所有节点都按分值大小来排序。

​ 节点的成员对象是一个指针,指向保存sds值的字符串对象。

1.3 重点
  • 跳跃表是有序集合的底层实现之一
  • redis的跳跃表是由 zskipList 和zskipListNode结构组成的
  • 跳跃表节点的层高为1到 32 之间的随机数
  • 每个节点可以包含相同的分值,但是成员对象必须是唯一的
  • 节点按照分值大小排序,当分值相同时,安照对象大小进行排序
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值