《Java架构师的第一性原理》102 Redis源码解析

通过阅读 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)
posted @ 2022-07-08 13:52  沙漏哟  阅读(64)  评论(0编辑  收藏  举报