美文网首页Redis相关
Redis 跳跃表(skiplist)

Redis 跳跃表(skiplist)

作者: Oliver_Li | 来源:发表于2019-12-08 16:57 被阅读0次
1. 跳跃表的原理
  • 传统有序链表查询节点需要遍历,复杂度为O(n)。


    《Redis5设计语言与源码分析》
  • 上图可理解为三层有序链表,每列都代表相同的元素值,当做冗余。
  • 以上图为例当查询节点51时,开始从顶层左侧开始遍历,链表下个节点为21,小于结果51,则继续查询,后续为null,则向下移,到第一层21位置,判断下个节点,41继续判断下个,61大于51则下移到第0层41位置,再下个节点为就是51。
  • 这种跳表方式比线性存遍历少了2次查询,元素数量多时更有效率。
2. 跳跃表结构
《Redis5设计语言与源码分析》
  • 图中最左边红框的是zskiplist辅助作用,右边每列都是一个zskiplistNode节点(重点),zskiplist header指向头结点,头结点高度默认64,初始化时默认生成,不代表具体数据。
  • zskiplistNode结构:
typedef struct zskiplistNode {
    sds ele;  // 对应zset的字符串数据
    double score;   // 对应zset里的分值
    struct zskiplistNode *backward;  // 指向前一个节点
    // 用柔性数组代表图上列的高度
    struct zskiplistLevel {
        struct zskiplistNode *forward;  //指向本层的下个节点
        unsigned long span;  // 本层的下个节点跨了几个元素
    } level[];
} zskiplistNode;
  • zskiplist结构:
typedef struct zskiplist {
    struct zskiplistNode *header, *tail;   // 如图代表头结点、尾节点
    unsigned long length;  //表长
    int level;  // 表高
} zskiplist;
3. 跳跃表实现
  • 创建:
    • 确定节点高度:每个节点的高度是0~63里随机的,高度越高概率越低,初始化为1层,每次取随机数有25%的几率再加一层继续循环,直到没有命中就跳出,最终确定层数,所以层数高的几率还是比较小的。
    • 上面说过初始化时就默认带头结点,所以需要初始化一个高度64的节点,分值为0,因为没有后续节点所以zskiplistLevel的forward都是null。
  • 添加和删除操作没有太难理解的,维护跳跃表forward、backward等相关数据和表结构即可。
4. 跳跃表应用
  • Redis中主要用于有序集合,是有序集合的一种实现方式,有两个相关配置,满足一条就会转化成跳跃表,根据结构可以得知跳跃表是空间换效率的方式,所以阈值过低会导致内存浪费。
    • zset-max-ziplist-entries(128):zset元素个数大于128时转化为跳跃表,否则是ziplist。
    • zset-max-ziplist-value(64):zset有元素长度大于64时转化为跳跃表,否则是ziplist。

相关文章

  • Redis 跳跃表(skiplist)

    Redis基础类型中的有序集合、集群节点的内部数据结构用到了跳跃表(skiplist)。 5.1 跳跃表的实现 图...

  • redis数据结构

    redis数据结构列表:简单动态字符串(sds)链表(list)字典(dict)跳跃表(skiplist)整数集合...

  • Redis 源码研究之skiplist

    本文主要记录Redis源码中skiplist数据结构的一些函数实现。 建议阅读: 1、Redis中跳跃表的理论说...

  • [redis 源码走读] 跳跃表(skiplist)

    跳跃表 张铁蕾的博客将 skiplist 原理和算法复杂度描述得很清楚,具体可以参考。我分享一下自己对部分源码的阅...

  • 跳跃表(skiplist)

    鸣谢: https://blog.csdn.net/xiaolei1982/article/details/507...

  • SkipList(跳跃表)

    简介   跳跃表是一种单链表形式的链式结构,不同于一般的链式结构其为多层链式结构。正因为这种多层结构从而相比于单式...

  • 「Redis设计与实现」跳跃表篇

    跳跃表简介 我们先抛开redis,单独了解下跳越表 skiplist本质上也是一种查找结构,用于解决算法中的查找问...

  • skiplist 跳跃表分析

    跳表(skip List)是一种随机化的数据结构,基于并联的链表,实现简单,插入、删除、查找的复杂度均为O(log...

  • 科普跳跃表-SkipList

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

  • 跳跃表skiplist原理

    github地址:https://github.com/arkulo56/thought/blob/master/...

网友评论

    本文标题:Redis 跳跃表(skiplist)

    本文链接:https://www.haomeiwen.com/subject/xqpmgctx.html