文章说明:阅读 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 的第一步,还需要继续看书,看代码,提问,总结