哈喽,大家好,我是一条。
本来今天是要和大家聊 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 ,阅读源码的同学带来帮助。
记得点赞在看!下期见!