如何查看redis源码中的 zskiplist 结构

文章说明:阅读 redis 设计与实现(第二版)第5章 跳跃表实现时,跳表的数据结构不是很理解,网上搜索如何阅读redis源码,找到相关源码。

1. 使用压缩包安装是否需要另外下载源码?

虽然一开始就找到了该网页,但是陷入了一个问题:文章中是使用源码安装,还是使用压缩包安装,搜索了一堆网页之后,发现答案还是在本文中

原因是认识到:开启redis进程肯定要装入程序,则不管是通过那种方式安装,源码肯定会在安装redis的相关目录中

说明:在 redis-cli 下输入info 关注 #Server 查看 redis 的安装版本

本文以及参考的文章中的版本分别是 6.2.6 和 3.2.5,推测在该区间内的版本应该都可以参照 如何阅读redis源码中整理的文件提示

敲重点:关注文中提到的 第一阶段

跳跃表:
server.h【zskiplsit 结构 和 zskiplistNode 结构】
t_zset.c 【zslCreate,zslInsert,zslDeleteNode 等所有以 zsl 开头的函数】

2. 定位到redis 安装目录的src下

[root@centos7 ~]# cd /usr/local/src/
[root@centos7 src]# ls
redis-6.2.6  redis-6.2.6.tar.gz
[root@centos7 src]# cd redis-6.2.6/
[root@centos7 redis-6.2.6]# ls

蓝色为文件目录,白色为文件,青色为可执行文件

可通过 ll 查看
在这里插入图片描述

3. 定位 server.h 文件

进入到 src/ 目录下后发现有很多文件,如何判断是否有 server.h 呢?

方法一:直接 vim server.h 弊端:若不存在该文件则会在该目录下创建文件名为 server.h 的文件

若是不小心添加,执行 rm -rf filename

方法二:find -name filename

[root@centos7 src]# find -name server.h
./server.h

提示 server.h 在当前目录下

方法三:MobaXterm 终端 选择 “Follow terminal folder”
在这里插入图片描述

4. 如何找到 zskiplist 结构声明

方法一:点击上图左侧文件列表直接打开

弊端:ctrl + f 仅支持一次全局搜索,不是到是不是我电脑上的bug

方法二:vim server.h

在命令模式下 /zskiplist
在这里插入图片描述
搜索到之后:使用 n 查找下一个,使用 N 查找上一个
在这里插入图片描述
zskiplist 和 zskiplistNode 的关系说明:

① zset :由 dict 和 zskiplist 组成

② zskiplist:首尾指针是 zskiplistNode 类型的

/* ZSETs use a specialized version of Skiplists */
typedef struct zskiplistNode {
	# obj 
    sds ele;
    # socre
    double score;
    # 后向指针
    struct zskiplistNode *backward;
    # 层
    struct zskiplistLevel {
    	# 前向指针
        struct zskiplistNode *forward;
        # 跨度
        unsigned long span;
    } level[];
} zskiplistNode;

typedef struct zskiplist {
	# zskiplistNode 类型的首尾指针
    struct zskiplistNode *header, *tail;
    # 节点数量
    unsigned long length;
    # 表中层数最大的节点层数
    int level;
} zskiplist;
typedef struct zset {
    dict *dict;
    zskiplist *zsl;
} zset;

看源码的原因:没有理解上面的跳跃表图中的zskiplist,不清楚 zskiplist 和 zskiplistNode 是怎么关联的

由于 zskiplist 中的 head 是 zskiplistNode 结构的,包含后向指针,可以连接 zskiplistNode 节点

zskiplist *zslCreate(void);
void zslFree(zskiplist *zsl);
zskiplistNode *zslInsert(zskiplist *zsl, double score, sds ele);
unsigned char *zzlInsert(unsigned char *zl, sds ele, double score);
int zslDelete(zskiplist *zsl, double score, sds ele, zskiplistNode **node);
zskiplistNode *zslFirstInRange(zskiplist *zsl, zrangespec *range);
zskiplistNode *zslLastInRange(zskiplist *zsl, zrangespec *range);

总结:了解 zskiplist 的第一步,还需要继续看书,看代码,提问,总结

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值