Redis中的跳跃表

Posted hhe0

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis中的跳跃表相关的知识,希望对你有一定的参考价值。

Redis中的跳跃表

  • 跳跃表是一种有序数据结构,它通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的
  • 跳跃表支持平均O(logN),最坏O(N)复杂度的节点查找,还可以通过顺序性操作来批量处理节点
  • 跳跃表在Redis用于实现有序集合键和在集群节点中用作内部数据结构

跳跃表的实现

// 跳跃表节点
typedef struct zskiplistNode {
    // 层
    struct zskiplistLevel {
        // 前进指针
        struct zskiplistNode *forward;
        // 跨度
        unsigned int span;
    } level[];
    // 后退指针
    struct zskiplistNode *backward;
    // 分数
    double score;
    // 成员对象
    robj *obj;
} zskiplistNode;
// 跳跃表
typedef struct zskiplist {
    // 表头节点和表尾节点
    structz skiplistNode *header, *tail;
    // 表中节点的数量
    unsigned long length;
    // 表中层数最大的节点的层数
    int level;
} zskiplist;

技术分享图片

  • 每次创建一个新跳跃表节点的时候,程序都根据幂次定律(越大的数出现的概率越小)随机生成一个介于1和32之间的值作为level数组的大小,这个大小就是层的“高度”

跳跃表API

函数 作用 时间复杂度
zslCreate 创建一个新的跳跃表 O(1)
zslFree 释放给定跳跃表,以及表中包含的所有节点 O(N),N为跳跃表的长度
zslInsert 将包含给定成员和分值的新节点添加到跳跃表中 平均O(logN),最坏O(N),N为跳跃表长度
zslDelete 删除跳跃表中包含给定成员和分值的节点 平均O(logN),最坏O(N),N为跳跃表长度
zslGetRank 返回包含给定成员和分支在跳跃表中的排位 平均O(logN),最坏O(N),N为跳跃表长度
zslGetElementByRank 返回跳跃表在给定排位上的节点 平均O(logN),最坏O(N),N为跳跃表长度
zslIsInRange 给定一个分值范围,如果跳跃表有至少一个节点的分值在这个范围之内,那么返回1,否则返回0 通过跳跃表的表头节点和表尾节点,这个检测可以用O(1)复杂度完成
zslFirstInRange 给定一个分值范围,返回跳跃表中第一个符合这个范围的节点 平均O(logN),最坏O(N),N为跳跃表长度
zslLastInRange 给定一个分值范围,返回跳跃表中最后一个符合这个范围的节点 平均O(logN),最坏O(N),N为跳跃表长度
zslDeleteRangeByScore 给定一个分值范围,删除跳跃表中所有在这个范围之内的节点 O(N),N为被删除节点数量
zslDeleteRangeByRank 给定一份排位范围,删除跳跃表中所有在这个范围之内的节点 O(N),N为被删除节点数量

以上是关于Redis中的跳跃表的主要内容,如果未能解决你的问题,请参考以下文章

Redis源码解读——跳跃表

Redis跳跃表原理分析与基本代码实现(java)

Redis跳跃表原理分析与基本代码实现(java)

Redis跳跃表实现原理(加快在有序链表中的查找速度)

Redis跳跃表实现原理(加快在有序链表中的查找速度)

Redis跳跃表