如何阅读 Redis 源码

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第3天,点击查看活动详情

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

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

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

源码下载

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

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.hsds.c Redis 的动态字符串实现。
adlist.hadlist.c Redis 的双端链表实现。
dict.hdict.c Redis 的字典实现。
redis.h 中的 zskiplist 结构和 zskiplistNode 结构, 以及 t_zset.c 中所有以 zsl 开头的函数, 比如 zslCreatezslInsertzslDeleteNode ,等等。 Redis 的跳跃表实现。
hyperloglog.c 中的 hllhdr 结构, 以及所有以 hll 开头的函数。 Redis 的 HyperLogLog 实现。
ziplist.hziplist.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.hrdb.c Redis 的 RDB 持久化实现代码。
aof.c Redis 的 AOF 持久化实现代码。

4.单机 Redis

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

ae.c ,以及任意一个 ae_*.c 文件(取决于你所使用的多路复用库)。 Redis 的事件处理器实现(基于 Reactor 模式)。
networking.c Redis 的网络连接库,负责发送命令回复和接受命令请求, 同时也负责创建/销毁客户端, 以及通信协议分析等工作。
redis.hredis.c 中和单机 Redis 服务器有关的部分。 单机 Redis 服务器的实现。

5.多机 Redis

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

replication.c 复制功能的实现代码。
sentinel.c Redis Sentinel 的实现代码。
cluster.c Redis 集群的实现代码。

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

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

记得点赞关注!下期见!

猜你喜欢

转载自juejin.im/post/7082373781171224584