搞懂Redis(二)-5:Zset数据结构

2022-04-18  本文已影响0人  高19

Zset有序集合和set相同在于成员不重复. 不同的是,有序集合的元素是可以排序的.但是它和列表使用的索引下标作为排序依据不同,它给每个元素设置一个分数,作为排序依据.
Zset底层数据结构:zipList和skipList
Zset也使用zipList做了排序.

zipList排序:

每个集合元素使用两个紧挨在一起的压缩列表节点来保存,第一个节点保存元素的成员(member),第二个保存元素的分值(score)
结构图如下:


zipList压缩结构
skipList跳表

与dict结合使用,结构较复杂


/*
 * 跳跃表
 */
typedef struct zskiplist {
    // 头节点,尾节点
    struct zskiplistNode *header, *tail;
    // 节点数量
    unsigned long length;
    // 目前表内节点的最大层数
    int level;
} zskiplist;

/*
 * 跳跃表节点
 */
typedef struct zskiplistNode {
    // member 对象
    robj *obj;
    // 分值
    double score;
    // 后退指针
    struct zskiplistNode *backward;
    // 层
    struct zskiplistLevel {
        // 前进指针
        struct zskiplistNode *forward;
        // 这个层跨越的节点数量
        unsigned int span;
    } level[];
} zskiplistNode;
什么是跳表?

我们先看下链表


链表结构图

如果要查找到node5,需要从node1查到node5,查询耗时.
如果在node上加上索引:


加索引的链表结构
这样通过索引就能直接从node1查找到node5
Redis跳跃表

Redis的跳表结构


Redis的跳表结构

右侧是4个zskiplistNode结构,包含以下属性

上一篇下一篇

猜你喜欢

热点阅读