如何阅读 Redis 的源码

2022-05-17 08:00:34 浏览数 (1)

哈喽,大家好,我是一条。

本来今天是要和大家聊 string 的具体实现的,又考虑到很多同学很能都没看过 Redis 的源码,所以先聊一下如何阅读 Redis 的源码。

主要包括源码下载、源码目录结构、源码阅读顺序的讲解。

源码下载

其实 Redis 的源码就在我们下载的安装文件里,可以到官网直接下载。

http://download.redis.io/releases/

版本的选择上可以不选择最新版的,因为老版本的功能比较少,看起来更简单,推荐 2.0-3.0 之间选择。

下载到本地之后需要选择一个编辑器打开,因为我们并不需要 debug 运行,所以推荐轻量的代码编辑器 Sublime Text ,如果平时有使用 VSCode 也是可以的,如果想使用专业的 C 语言编译器,也可以尝试 JetBrains 的 C/C 工具 clion。

源码的目录结构

用编辑器打开之后,先了解一下代码的结构,我们主要关注是这几个文件:

其中 .conf 是配置文件, src 目录下就是我们要看的源码文件,通过文件名字大致就可以推断出相关的内容,所以阅读起来也是非常方便。

阅读顺序

虽然整个代码只有约 23000 行,但一个正确、高效的阅读顺序也会让我们事半功倍。

1.数据结构实现

首先 Redis 为了节省内存,自己定义了一些数据结构,比如 SDS(简单动态字符串)、压缩列表,也使用了我们接触过的经典数据结构,比如双端链表、跳表等。

这部分内容与其他部分耦合较少,不至于被劝退。同时又能体会 Redis 真是将内存利用到了极致。

包含的主要文件:

sds.h 和 sds.c

Redis 的动态字符串实现。

adlist.h 和 adlist.c

Redis 的双端链表实现。

dict.h 和 dict.c

Redis 的字典实现。

redis.h 中的 zskiplist 结构和 zskiplistNode 结构, 以及 t_zset.c 中所有以 zsl 开头的函数, 比如 zslCreate 、 zslInsert 、 zslDeleteNode ,等等。

Redis 的跳跃表实现。

hyperloglog.c 中的 hllhdr 结构, 以及所有以 hll 开头的函数。

Redis 的 HyperLogLog 实现。

ziplist.h 和 ziplist.c

压缩列表(zip list)数据结构。

2.数据类型的实现

了解过 Redis 的数据结构之后,就可以分析我们常用的数据类型都是如何实现的了。

object.c

Redis 的对象(类型)系统实现。

t_string.c

字符串键的实现。

t_list.c

列表键的实现。

t_hash.c

散列键的实现。

t_set.c

集合键的实现。

t_zset.c 中除 zsl 开头的函数之外的所有函数。

有序集合键的实现。

hyperloglog.c 中所有以 pf 开头的函数。

HyperLogLog 键的实现。

3.数据库相关

这部分就是我们常说数据持久化,rdb 和 aof 。也可以深入阅读 事务相关 LRU脚本等。

redis.h 文件中的 redisDb 结构, 以及 db.c 文件。

Redis 的数据库实现。

notify.c

Redis 的数据库通知功能实现代码。

rdb.h 和 rdb.c

Redis 的 RDB 持久化实现代码。

aof.c

Redis 的 AOF 持久化实现代码。

4.单机 Redis

这部分包括单机 Redis 的客户端和服务端代码,比如事件处理、网络通信、命令交互等。

ae.c ,以及任意一个 ae_*.c 文件(取决于你所使用的多路复用库)。

Redis 的事件处理器实现(基于 Reactor 模式)。

networking.c

Redis 的网络连接库,负责发送命令回复和接受命令请求, 同时也负责创建/销毁客户端, 以及通信协议分析等工作。

redis.h 和 redis.c 中和单机 Redis 服务器有关的部分。

单机 Redis 服务器的实现。

5.多机 Redis

这部分包括主从复制,哨兵监控、故障转移、多机集群等。

replication.c

复制功能的实现代码。

sentinel.c

Redis Sentinel 的实现代码。

cluster.c

Redis 集群的实现代码。

以上就是 Redis 单机功能和多机功能的所有代码。

Redis 的设计非常巧妙和高效,认真读完一定会受益匪浅,同时也会对你阅读其它源码有帮助和启发。希望本文能给想深入学习 Redis ,阅读源码的同学带来帮助。

记得点赞在看!下期见!

0 人点赞