Redis源码分析——跳跃表

本文深入分析Redis 5.0.5版本中跳跃表(zskiplist, zsiplistnode)的原理,包括跳跃表的概念、结构以及创建、插入、查找和删除等关键函数的源码解析,探讨了Redis为何使用跳跃表作为有序集合的底层实现之一。" 86670326,5780368,Redis集群ADDSLOTS支持区间分配实现解析,"['redis', 'cluster', '命令行']
摘要由CSDN通过智能技术生成

本篇文章则针对源码来进行分析

跳跃表(zskiplist zsiplistnode)概念

  • 跳跃表是一种有序数据结构,它通过在每个节点中维持多个指向其它节点的指针,从而达到快速访问的目的。
  • 跳跃表平均支持O(logN)、最坏O(N)复杂度的节点查找,还可以通过顺序性操作来批处理节点。
    Redis何时使用跳跃表?
  • Redis使用跳跃表作为有序集合键的底层实现之一,如果一个有序集合包含的元素数量比较多,又或者有序集合中元素的成员是比较长的字符串时,Redis就会使用跳跃表来作为有序集合键的底层实现。

跳跃表的结构

typedef struct zskiplistNode {
   
    sds ele; //sds字符串
    double score; //分值
    struct zskiplistNode *backward; //后退指针,只在第1层有
    //level
    struct zskiplistLevel {
   
        struct zskiplistNode *forward; //前向指针
        unsigned long span; //跨度
    } level[]; //柔性数组
} zskiplistNode;

typedef struct zskiplist {
   
    struct zskiplistNode *header, *tail; //跳表的头指针和尾指针
    unsigned long length; //元素总数
    int level; //层级
} zskiplist;

解析创建插入查找删除函数(在代码中用注释详细解析)

1.创建函数

zskiplistNode *zslCreateNode(int level, double score, sds ele) {
   
    //分配内存
    zskiplistNode *zn =
        zmalloc(sizeof(*zn)+level*sizeof(struct zskiplistLevel));
    zn->score = score;
    zn->ele = ele;
    return zn;
}

/* Create a new skiplist. */
zskiplist *zslCreate(void) {
   
    int j;
    zskiplist *zsl;

    zsl = zmalloc(sizeof(*zsl));
    zsl->level = 1;
    zsl->length = 0;
    zsl->header = zslCreateNode(ZSKIPLIST_MAXLEVEL,0,NULL);
    //初始化每一层节点
    for (j = 0; j < ZSKIPLIST_MAXLEVEL; j++) {
   
        zsl->header->level[j].forward = NULL;
        zsl->header->level[j].span = 0;
    }
    zsl->header->backward = NU
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值