跳跃表的底层实现

跳跃表的底层是由 C 语言实现的,它的实现源码如下:

typedef struct zskiplistNode {
   
	// 成员对象
    robj *obj;
    double score; // 分值
    struct zskiplistNode *backward; // 回退指针
    //层
    struct zskiplistLevel {
   
    	// 前进指针
        struct zskiplistNode *forward;
        // 跨度
        unsigned int span;
    } level[];
} zskiplistNode;
  • obj:用于存储字符串类型的数据;
  • score:用于存储排序的分值;
  • backward:后退指针,只能指向当前节点最底层的前一个节点,头节点和第一个节点 backward 指向 NULL,从后向前遍历跳跃表时使用;
  • level:柔性数组。每个节点的数组长度不一样,在生成跳跃表节点时,随机生成一个 1-64 的值,值越大出现的概率越低。level 数组的每项包含以下两个元素:
    • forward:指向本层下一个节点,尾节点的 forward 指向 NULL;
    • span:forward 指向的节点与本节点之间的元素个数,span 值越大,跳过的节点个数越多。

除了跳跃表节点外,还需要一个跳跃表结构来管理节点,Redis 使用 zskiplist 结构体,定义如下:

typedef struct zskiplist {
   
    struct zskiplistNode *header, *tail;
    unsigned long length;
    int level;
} zskiplist;
  • header:指向跳跃表头节点。头节点是跳跃表的一个特殊节点,它的 level 数组元素个数为 64。头节点在有序集合中不存储任何 member 和 score 值,ele 值为 NULL, score 值为 0,也不计入跳跃表的总长度。头节点在初始化时,64 个元素的 forward 都指向 NULL,span 值都为 0;
  • tail:指向跳跃表尾节点;
  • length:跳跃表长度,表示除头节点之外的节点总数;
  • level:跳跃表的高度。

它的结构实现如下图所示:

在这里插入图片描述

在这里插入图片描述

相关推荐

  1. python实现跳跃

    2024-02-09 21:10:01       8 阅读
  2. 详解Qml底层实现

    2024-02-09 21:10:01       34 阅读
  3. 【Vue】实现底层原理

    2024-02-09 21:10:01       20 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-02-09 21:10:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-09 21:10:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-09 21:10:01       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-09 21:10:01       20 阅读

热门阅读

  1. RAG 新路径!提升开发效率、用户体验拉满

    2024-02-09 21:10:01       28 阅读
  2. 服务运营 | 摘要:POMS 1月医疗文章合集

    2024-02-09 21:10:01       26 阅读
  3. 力扣240题之搜索二维矩阵

    2024-02-09 21:10:01       17 阅读
  4. ABC339(A-C)

    2024-02-09 21:10:01       28 阅读
  5. 平台工程是 FinOps 的“黄金路径”

    2024-02-09 21:10:01       26 阅读
  6. 【Redis笔记】使用Redisson实现可重入锁

    2024-02-09 21:10:01       32 阅读
  7. Nginx实现对流量控制模块的配置与应用!

    2024-02-09 21:10:01       32 阅读
  8. 如何利用chatgpt提升工作效率?

    2024-02-09 21:10:01       28 阅读
  9. 双非本科准备秋招(21.1)—— 力扣二叉搜索树

    2024-02-09 21:10:01       31 阅读
  10. LLVM实战之将LLVM bitcode转回为LLVM汇编码

    2024-02-09 21:10:01       25 阅读
  11. 策略模式的代码实践示例

    2024-02-09 21:10:01       27 阅读
  12. C++服务器端开发(2):确定服务器框架

    2024-02-09 21:10:01       23 阅读