zoukankan      html  css  js  c++  java
  • 跳跃表 -《Redis设计与实现》读书笔记

    使用场景

    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
    只言片语任我说,提笔句句无需忖。落笔不知寄何人,唯有邀友共斟酌。
  • 相关阅读:
    GAE 1.5.1 SDK Prerelease
    GAE 1.5.1 SDK Prerelease
    SVN 分支更新与合并
    暂时告别 CSDN 博客,移居 GAE(http://88250.b3log.org)
    暂时告别 CSDN 博客,移居 GAE(http://88250.b3log.org)
    NetBeans 时事通讯(刊号 # 152 Jun 22, 2011)
    NetBeans 时事通讯(刊号 # 152 Jun 22, 2011)
    NetBeans 时事通讯(刊号 # 151 Jun 15, 2011)
    SVN 分支更新与合并
    NetBeans 时事通讯(刊号 # 151 Jun 15, 2011)
  • 原文地址:https://www.cnblogs.com/phonecom/p/15090622.html
Copyright © 2011-2022 走看看