如何理解redis跳表源码中的span?

本文详细介绍了在理解Redis跳表源码时如何逐步解析zskiplist结构,重点探讨了span的作用。通过简化代码,作者揭示了span在跳表节点插入和查找过程中的关键功能,即用于快速计算节点排名。理解span的更新和累加机制是掌握跳表工作原理的关键。
摘要由CSDN通过智能技术生成

2018年12月30日12:26:04 我扑在跳表上,前后反复研究了十几二十次,一直都理解不了(大脑拒绝理解,停机)。昨晚下定决心(总结以前和现在学到的所有信息),拆分逻辑块,过滤这阶段不需要的信息,终于能理解跳表的基本结构了。

看源码有个小技巧(我的),不从main为入口,而是以model(模型)为逻辑块。

(1)先理解整体的zskiplist,哦,这个其实跟普通的链表是一样的,有header、有tail,还有长度;

(2)然后是结点Node;

(3)然后接下来要看的是model的CRUD,数据怎么生成、怎么删除。

 

而在看跳表插入结点Node时,先看理解zskiplistNode的ele+score+level,脑子里自动屏蔽span,因为跳表Node实际需要的是数据ele+score,还有层级level。

 

ele好理解吧?就是文字,而score就是评分。然后支撑起跳表层级的就是level。那为什么要将span放在最后呢?zslInsert插入跳表结点时,有50%~60%的代码都是讲span,完全混淆了我们看代码的顺序,把span相关的代码删掉后,你会发现很容易理解跳表。。马丹

 

/* Insert a new node in the skiplist. Assumes the element does not already
 * exist (up to the caller to enforce that). The skiplist takes ownership
 * of the passed SDS string 'ele'. */
zskiplistNode *zslInsert(zskiplist *zsl, double score, sds ele) {
    zskiplistNode *update[ZSKIPLIST_MAXLEVEL], *x;
    unsigned int rank[ZSKIPLIST_MAXLEVEL];
    int i, level;

    serverAssert(!isnan(score));
    x = zsl->header;
    for (i = zsl->level-1; i >= 0; i--) {
        /* store rank that is crossed to reach the insert position */
        rank[i] = i == (zsl->level-1) ? 0 : rank[i+1];
        while (x->level[i].forward &&
                (x->level[i].forward->score < score 
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值