(Redis篇-5)- Redis的跳表?

2021-09-11  本文已影响0人  Burlong

redis使用跳跃表作为有序集合键的底层实现之一,当一个有序集合包含的元素数量比较多时,redis会使用跳表结构对查询效率进行优化。

与常规链表的不同之处

redis的跳表与常规跳表不同的地方在于

redis中的跳表两个关键struct-结构体

1、zskipList

c语言代码示例:

typedef struct zskiplist {

    // 头节点,尾节点
    struct zskiplistNode *header, *tail;

    // 节点数量
    unsigned long length;

    // 目前表内节点的最大层数
    int level;

} zskiplist;

属性:

2、zskiplistNode

c语言代码示例:

typedef struct zskiplistNode {

    // member 对象
    robj *obj;

    // 分值
    double score;

    // 后退指针
    struct zskiplistNode *backward;

    // 层
    struct zskiplistLevel {

        // 前进指针
        struct zskiplistNode *forward;

        // 这个层跨越的节点数量
        unsigned int span;

    } level[];

} zskiplistNode;

属性:


两个数据结构的各个API的时间复杂度一览

image.png

应用

redis中跳表唯一的应用就是用来实现有序集数据类型。

如下,创建一个带3个元素的有序集:

redis> ZADD s 6 x 10 y 15 z
(integer) 3

redis> ZRANGE s 0 -1 WITHSCORES
1) "x"
2) "6"
3) "y"
4) "10"
5) "z"
6) "15"

在redis中则会映射出这样一个跳表

image.png

注:图中的score值实际只存储了指针,由于要跟另一个实现有序集的结构(字典)分享,真实值是不存储于节点中的。

总结:

参考:

Redis数据结构--跳跃表

上一篇下一篇

猜你喜欢

热点阅读