IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 如何查看redis源码中的 zskiplist 结构 -> 正文阅读

[大数据]如何查看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 的第一步,还需要继续看书,看代码,提问,总结

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-04-15 00:05:37  更:2022-04-15 00:10:19 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 2:29:33-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码