Redis 源码硬核解析系列专题 - 第四篇:核心数据结构之跳表(Skip List)

1. 引言

跳表(Skip List)是一种高效的动态数据结构,在Redis中用于实现有序集合(ZSET),支持快速的范围查询和插入删除操作。相比传统平衡树(如AVL或红黑树),跳表的实现更简单且性能优异。本篇将深入剖析Redis跳表的源码实现,包括结构定义、插入删除逻辑和随机层高生成。


2. 跳表在Redis中的应用
  • 用途:ZSET的核心数据结构,存储元素和分数(score),支持按分数排序。
  • 特性:结合链表的简单性和二分查找的高效性,平均时间复杂度为O(log n)。

3. 跳表的结构体定义

跳表的实现位于src/server.hsrc/t_zset.c中。以下是核心结构:

代码片段server.h):

typedef struct zskiplistNode {
   
    sds ele;                  // 元素(SDS字符串)
    double score;             // 分数
    struct zskiplistNode *backward; // 后退指针
    struct zskiplistLevel {
   
        struct zskiplistNode *forward; // 前进指针
        unsigned long span;     // 跨度(到下个节点的距离)
    } level[];                // 层数组(柔性数组)
} zskiplistNode;

typedef struct zskiplist {
   
    struct zskiplistNode *header; // 头节点
    struct zskiplistNode *tail;   // 尾节点
    unsigned long length;         // 节点数
    int level;                   // 最大层数
} zskiplist;

硬核解析

  • zskiplistNode:每个节点包含元素、分数和多层前进指针(level[])。
  • level[i].forward:指向该层下一个节点。
  • span:记录跨越的节点数,用于范围查询。
  • backward:后退指针,便于双向遍历。
  • zskiplist:管理整个跳表,header不存储数据,仅作为起点。

Mermaid结构图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无名架构师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值