通过阅读 Redis 源码,可以学习和掌握到的计算机系统设计思想
根据 Redis 不同的功能特性,分线条学习每个功能特性上涉及的关键技术和设计思想
对于Redis的代码架构,需要掌握以下两类内容
-
代码的目录结构和作用划分,目的是理解 Redis 代码的整体架构,以及所包含的代码功能类别;
-
系统功能模块与对应代码文件,目的是了解 Redis 实例提供的各项功能及其相应的实现文件,以便后续深入学习。
对于阅读 Redis 源码来说,要先从整体上掌握源码的结构,所以需要先形成一幅 Redis 源码的全景图(基于 Redis 5.0.8 版本)
-
deps 目录
这个目录主要包含了 Redis 依赖的第三方代码库,包括 Redis 的 C 语言版本客户端代码 hiredis、jemalloc 内存分配器代码(用来替换 glibc 库的内存分配器)、readline 功能的替代代码 linenoise,以及 lua 脚本代码。这部分代码的一个显著特点,就是它们可以独立于 Redis src 目录下的功能源码进行编译,也就是说,它们可以独立于 Redis 存在和发展。
-
src 目录
这个目录里面包含了 Redis 所有功能模块的代码文件,也是 Redis 源码的重要组成部分。src 目录下只有一个 modules 子目录,其中包含了一个实现 Redis module 的示例代码。剩余的源码文件都是在 src 目录下。
-
tests 目录
这个目录里面是用于功能模块测试和单元测试的代码。Redis 实现的测试代码可以分成四部分,分别是单元测试(对应 unit 子目录),Redis Cluster 功能测试(对应 cluster 子目录)、哨兵功能测试(对应 sentinel 子目录)、主从复制功能测试(对应 integration 子目录)。这些子目录中的测试代码使用了 Tcl 语言(通用的脚本语言)进行编写,主要目的就是方便进行测试。
-
utils 目录
这个目录里面是在 Redis 开发过程中的一些辅助性功能,包括用于创建 Redis Cluster 的脚本、用于测试 LRU 算法效果的程序,以及可视化 rehash 过程的程序。
代码分类(忽略.h头文件)
数据类型:
- String(t_string.c、sds.c、bitops.c)
- List(t_list.c、ziplist.c、quicklist.c)
- Hash(t_hash.c、ziplist.c、dict.c)
- Set(t_set.c、intset.c)
- Sorted Set(t_zset.c、ziplist.c、dict.c)
- HyperLogLog(hyperloglog.c)
- Geo(geo.c、geohash.c、geohash_helper.c)
- Stream(t_stream.c、rax.c、listpack.c)
全局:
-
Server(
server.c-->main入口
、anet.c) - Object(object.c)
- 键值对(db.c)
- 事件驱动(ae.c、ae_epoll.c、ae_kqueue.c、ae_evport.c、ae_select.c、networking.c)
- 内存回收(expire.c、lazyfree.c)
- 数据替换(evict.c)
- 后台线程(bio.c)
- 事务(multi.c)
- PubSub(pubsub.c)
- 内存分配(zmalloc.c)
- 双向链表(adlist.c)
高可用&集群:
- 持久化:RDB(rdb.c、redis-check-rdb.c)、AOF(aof.c、redis-check-aof.c)
- 主从复制(replication.c)
- 哨兵(sentinel.c)
- 集群(cluster.c)
辅助功能:
- 延迟统计(latency.c)
- 慢日志(slowlog.c)
- 通知(notify.c)
- 基准性能(redis-benchmark.c)