Redis 代码整体架构
了解 Redis 代码的整体架构将帮助我们快速定位各个功能模块对应的代码文件,并全面了解 Redis 的功能。
Redis 目录结构
Redis 的源码总目录下包含四个子目录:deps、src、tests 和 utils。每个目录都有其特定的作用。通过了解目录结构的作用可以快速认知系统。
- deps 目录
deps 目录包含 Redis 依赖的第三方代码库,包括 hiredis(客户端代码)、jemalloc(高效内存分配器)、linenoise(替代 readline 功能)以及 Lua 脚本代码。这些库可以独立于 Redis 存在和发展,因此被单独放在 deps 目录下。
- src 目录
src 目录是 Redis 源码的核心,包含所有功能模块的代码文件。Redis 的 C 语言风格比较典型,所有源码文件都放在同一级目录下,通过头文件进行相互调用。
- tests 目录
tests 目录存放 Redis 的测试代码,分为单元测试(unit)、Redis Cluster 功能测试(cluster)、哨兵功能测试(sentinel)和主从复制功能测试(integration)。这些测试代码使用 Tcl 语言编写,方便功能验证。
- utils 目录
utils 目录包含辅助性功能代码,如创建 Redis Cluster 的脚本、测试 LRU 算法效果的程序以及可视化 rehash 过程的程序。
此外,Redis 源码总目录下还包含两个重要的配置文件:redis.conf(Redis 实例配置)和 sentinel.conf(哨兵配置)。
Redis 功能模块与源码对应
梳理 Redis 的功能模块及其对应的源码文件,能快速找到相关代码。
- 服务器实例
Redis 的初始化和控制流程由 server.h 和 server.c 实现,主入口函数位于 server.c 中。网络通信功能通过事件驱动机制实现,相关代码包括 ae.h、ae.c、ae_epoll.c 等文件。TCP 网络通信和客户端功能分别由 anet.h、anet.c 和 networking.c 实现。
int main(int argc, char **argv) {initServerConfig();initServer();// 其他初始化代码aeMain(server.el);return 0;
}
- 数据库数据类型与操作
Redis 提供多种数据类型,包括 String、List、Hash、Set 和 Sorted Set。每种数据类型都有相应的底层数据结构,如 SDS(用于 String)、哈希表和压缩列表(用于 Hash)。具体实现代码在相应的 .c 文件和 .h 文件中,如 dict.c 和 dict.h(实现哈希表)。
typedef struct dictEntry {void *key;union {void *val;uint64_t u64;int64_t s64;} v;struct dictEntry *next;
}
内存管理是 Redis 的重要优化点,包括内存分配(zmalloc.h/zmalloc.c)、内存回收(expire.c 和 lazyfree.c)以及数据替换策略(evict.c)。
- 高可靠性和高可扩展性
Redis 提供数据持久化和主从复制功能,分别由 rdb.h、rdb.c 和 aof.c 以及 replication.c 文件实现。哨兵机制的实现代码在 sentinel.c 中。Redis Cluster 提供高可扩展性,其实现代码集中在 cluster.h、cluster.c 中。
- 辅助功能
Redis 的辅助功能包括操作延迟监控(latency.h、latency.c)、慢命令记录(slowlog.h、slowlog.c)以及性能评测(redis-benchmark.c)。
结语
通过这篇文章,我们对 Redis 的代码架构有了一个整体的认识。了解目录结构和功能模块后,你可以更高效地学习和使用 Redis。