ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

跳跃表 -《Redis设计与实现》读书笔记

2021-08-02 17:03:36  阅读:145  来源: 互联网

标签:struct 读书笔记 Redis 表头 zskiplistNode 跳跃 节点 指针


使用场景

  1. 当有序集合包含的元素数量比较多 或者 有序集合中元素的成员是比较长的字符串时,使用跳跃表实现有序集合
  2. 集群节点中用作内部数据结构

定义

// 跳跃表节点
typedef struct zskiplistNode {
    // 成员对象:一个SDS值
    // 在同一个跳跃表中,各个节点保存的成员对象必须是唯一的,但是多个节点保存的分值却可以是相同的
    // 分值相同的节点将按照成员对象在字典序中的大小来进行排序,成员对象较小的节点会排在前面(靠近表头的方向),而成员对象较大的节点则会排在后面(靠近表尾的方向)
    sds ele;

    // 分值
    // 跳跃表中的所有节点都按分值从小到大排序
    double score;

    // 后退指针:用于从表尾向表头方向访问节点
    // 每次只能后退至前一个节点
    struct zskiplistNode *backward;

    // 层数组可以包含多个元素,每个元素都包含一个指向其他节点的指针
    // 层可以加快访问其他节点的速度,一般来说,层的数量越多,访问其他节点的数据越快
    // 每次创建一个新跳跃表节点的时候,根据幂次定律(越大的数出现的概率越小)随机生成一个介于1和32之间的值作为level数组的大小
    struct zskiplistLevel {
        // 前进指针:用于从表头向表尾方向访问节点
        struct zskiplistNode *forward;

        // 跨度:记录前进指针所指向节点和当前节点的距离
        // 两个节点之间的跨度越大,相距得就越远
        // 由于指向null的所有前进指针没有连向任何节点,所以跨度都为0
        // 跨度用来计算排位(rank)
        unsigned long span;
    } level[];

} zskiplistNode;

// 跳跃表
typedef struct zskiplist {
    // 指向跳跃表的表头节点:表头节点的后退指针、分值和成员对象属性都不会被用到,仅用到层属性
    // 指向跳跃表的表尾节点
    struct zskiplistNode *header, *tail;

    // 跳跃表内节点的数量
    unsigned long length;

    // 跳跃表内层数最大的那个节点的层数(表头节点的层数不算)
    int level;

} zskiplist;

源码阅读

  1. 文件:src/server.h、src/t_zset.c、src/sort.c

标签:struct,读书笔记,Redis,表头,zskiplistNode,跳跃,节点,指针
来源: https://www.cnblogs.com/phonecom/p/15090622.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有