当前位置:网站首页>如何查看redis源码中的 zskiplist 结构
如何查看redis源码中的 zskiplist 结构
2022-04-21 18:34:00 【执霜】
文章说明:阅读 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 的第一步,还需要继续看书,看代码,提问,总结
版权声明
本文为[执霜]所创,转载请带上原文链接,感谢
https://blog.csdn.net/qq_43156556/article/details/124142572
边栏推荐
- C language operator summary
- C语言操作符汇总
- Appium principle and jsonwp protocol analysis of automatic testing of dry goods app
- ArrayList of collection
- Target penetration exercise 69-dc1
- After 4 rounds and 2 hours, finally cut meituan offer!
- MYCAT horizontal sub table (E-R table)
- 靶机渗透练习71-DC3
- Don't look for it. This is the clearest article on microservices so far! No one
- Target penetration exercise 80 momentum: 1
猜你喜欢

别找了,这是迄今为止把微服务讲的最清楚的一篇!没有之一

C语言进阶第48式:函数设计原则

哪路神仙写的421页MySQL高级笔记,涵盖MySQL所有技术!太香了
![[daiy4] jz76 delete duplicate nodes in the linked list (recursion)](/img/d7/c8e5b575ea93ba170c994e70b4e1cb.png)
[daiy4] jz76 delete duplicate nodes in the linked list (recursion)

Target penetration exercise 74-dc6

ACM anniversary C language

靶机渗透练习76-DC8

Essays (VI) -- tqdm progress bar shows more than one line

Can we find the next "cheese stick" product in the 2022 Q1 financial report of miaolando?

Target penetration exercise 70-dc2
随机推荐
ACM anniversary C language
Dry goods | who understands this article and can get stuck playing games?
再见SharedPreferences,你好MMKV!
如何用PS制作动图
找出相等差值的卡片 (20 分) C语言
K-means, hierarchy, EM clustering introduction
How does IOT platform realize business configuration center
Target penetration exercise 79 venom
Goodbye SharedPreferences, hello mmkv!
Collection小结
干货|app自动化测试之Appium WebView 技术原理
[network] summary of 4G and 5g frequency bands
靶机渗透练习69-DC1
华为18级大牛整理总结:微服务设计和分布式服务框架原理实践文档
总结了30个例子之后,我悟到了Flutter的布局原理
别找了,这是迄今为止把微服务讲的最清楚的一篇!没有之一
工作总结!日志打印的15个建议
[small program] Alipay applet custom pull down refresh component
接口管理工具YApi怎么用?颜值高、易管理、超好用
干货|app自动化测试之Appium 原理 与 JsonWP 协议分析