我们究竟该如何学习 Redis 的代码架构呢?我的建议是要掌握以下两方面内容:
- 代码的目录结构和作用划分,目的是理解 Redis 代码的整体架构,以及所包含的代码功能类别;
- 系统功能模块与对应代码文件,目的是了解 Redis 实例提供的各项功能及其相应的实现文件,以便后续深入学习。
deps 目录
这个目录主要包含了 Redis 依赖的第三方代码库,包括 Redis 的 C 语言版本客户端代码 hiredis、jemalloc 内存分配器代码、readline 功能的替代代码 linenoise,以及 lua 脚本代码。
这部分代码的一个显著特点,就是它们可以独立于 Redis src 目录下的功能源码进行编译,也就是说,它们可以独立于 Redis 存在和发展。
主要存放了三类代码:一是 Redis 依赖的、实现更加高效的功能库,如内存分配;二是独立于 Redis 开发演进的代码,如客户端;三是 lua 脚本代码。
src目录
这个目录里面包含了 Redis 所有功能模块的代码文件,也是 Redis 源码的重要组成部分。
tests 目录
Redis 实现的测试代码可以分成四部分,分别是单元测试(对应 unit 子目录),Redis Cluster 功能测试(对应 cluster 子目录)、哨兵功能测试(对应 sentinel 子目录)、主从复制功能测试(对应 integration 子目录)。
utils 目录
在 Redis 开发过程中,还有一些功能属于辅助性功能,包括用于创建 Redis Cluster 的脚本、用于测试 LRU 算法效果的程序,以及可视化 rehash 过程的程序。在 Redis 代码结构中,这些功能代码都被归类到了 utils 目录中统一管理。
Redis 功能模块与源码对应
服务器实例
如果你想了解 Redis 是如何开始运行的,那么就可以从 server.c 的 main 函数开始看起。
Redis 使用了基于事件驱动机制的网络通信框架,涉及的代码文件包括 ae.h/ae.c,ae_epoll.c,ae_evport.c,ae_kqueue.c,ae_select.c。
数据库数据类型与操作
各数据类型对应的实现:
高可靠性和高可扩展性
主要包括:数据持久化实现和主从复制
Redis 的数据持久化实现有两种方式:内存快照 RDB 和 AOF 日志,分别实现在了 rdb.h/rdb.c 和 aof.c 中。
Redis 把主从复制功能实现在了 replication.c 文件中。
哨兵机制,这部分功能则直接实现在了 sentinel.c 文件中。
Redis Cluster 来实现的,这部分代码也非常集中,就是在 cluster.h/cluster.c 代码文件中。
辅助功能
Redis 在 latency.h/latency.c 中实现了操作延迟监控的功能;为了便于运维人员查找运行过慢的操作命令,Redis 在 slowlog.h/slowlog.c 中实现了慢命令的记录功能,等等。
此文章为10月Day1学习笔记,内容来源于极客时间《Redis 源码剖析与实战》