redis 6.0 源码代码整体结构
整体结构
在redis源码目录下,一共包含了deps、src、tests、utils四个子目录。
除了deps、src、tests、utils四个子目录以外,Redis源码总目录下还包含了两个重要的配置文件,一个是Redis实例的配置文件redis.conf,另一个是哨兵的配置文件sentinel.conf
deps目录
主要包含了Redis依赖的第三方代码库,这些代码可以独立于Redis src目录下的功能源码进行编译
- hiredis:redis的C语言版本客户端代码
- jemalloc:代替glibc库的内存分配器
- linenoise:代替readline,命令行解析工具
- lua:包含lua脚本代码
src目录
包含了Redis所有功能模块的代码文件,包含quicklist、sds、rdb、dict(核心结构)等
为什么所有功能模块都在一起:
C语言风格,不同功能模块之间不设置目录分隔,而是通过头文件包含来相互调用。
src目录,包含了所有功能模块,可以按照Redis的服务器实例、数据库操作、可靠性和可扩展性保证、辅助功能分为四个维度
服务器实例
- server.c:Redis在运行时是一个网络服务器实例,server.c包含服务器实例的初始化和主体控制流程,Redis main入口函数也是在server.c中
- ae.c,ae_epoll.c,ae_evport.c,ae_kqueue.c,ae_select.c:提供事件驱动网络框架。ae_select.c和ae_epoll.c文件,分别使用了select和epoll这两种机制,实现IO多路复用;ae_evport.c对应Solaris上的IO复用函数evport;ae_kqueue.c对应macOS或FreeBSD上的IO复用函数kqueue;ae.c实现了Reactor模型
- anet.c:对TCP网络通信的Socket连接、设置等操作进行了封装,在Redis Cluster创建和主从复制的过程中,会被调用并用于建立TCP连接
- networking.c:客户端的创建、消息回复
数据库操作
Redis提供了丰富的键值对类型,其中包括了String、List、Hash、Set、Sorted Set、位图、HyperLogLog、Geo等
数据结构如下:
- String:sds.c,底层数据结构SDS。涉及代码t_string.c、sds.c
- List:双向链表(adlist.c)、ziplist、quicklist作为List的底层实现。涉及代码t_list.c、ziplist.c、adlist.c、quicklist.c
- Hash:数据结构底层实现为一个字典( dict ),当数据量比较小,或者单个元素比较小时,底层用ziplist存储(ziplist.c)。涉及代码t_hash.c、ziplist.c、dict.c
- Set:数据结构底层实现为一个value 为 null 的字典(dict),当数据可以用整型表示时,Set集合将被编码为intset数据结构(intset.c)。涉及代码t_set.c、intset.c
- Sorted Set:实现代码在t_zset.c,数据结构底层实现为 字典(dict) + 跳表(skiplist) ,当数据比较少时,用ziplist编码结构存储。涉及代码t_zset.c、ziplist.c、dict.c
- 位图:bitops.c
- HyperLogLog:HyperLogLog.c
- Geo:geo.c、geohash.c、geohash_helper.c
- Stream:时序数据,t_stream.c、rax.c、listpack.c
redis数据库操作代码:db.c,实现了对键值对的新增、查询、修改和删除等操作接口
内存优化代码:
- 内存分配:zmalloc.c,Redis支持使用不同的内存分配器,包括glibc库提供的默认分配器tcmalloc、第三方库提供的jemalloc
- 内存回收:expire.c,支持设置过期key,并针对过期key可以使用不同删除策略;lazyfree.c,实现了异步删除key,回收内存
- 数据替换:evict.c,如果内存满了,可以根据LRU、LFU等算法清除不需要的数据
可靠性和可扩展性保证
Redis可以对数据做持久化保存,并且它还实现了主从复制机制,从而可以提供故障恢复的功能
- 数据持久化实现:内存快照RDB 和 AOF日志,分别实现在了 rdb.h/rdb.c 和 aof.c 中。以及对这两类文件的检查功能(宕机导致未能完整保持),对应的代码文件分别是redis-check-rdb.c和redis-check-aof.c
- 主从复制功能实现:replication.c
高可扩展性保证的功能,是通过Redis Cluster来实现的,代码为cluster.c
辅助功能
Redis还实现了一些用于支持系统运维的辅助功能
如下:
- latency.c:实现了操作延迟监控的功能,便于运维人员查看分析不同操作的延迟产生来源
- slowlog.c:实现了慢命令的记录功能,便于运维人员查找运行过慢的操作命令
tests目录
功能模块测试和单元测试的代码
- unit:单元测试,如过期key的测试(expire.tcl)、惰性删除的测试(lazyfree.tcl)、不同数据类型操作的测试(下面type子目录)
- cluster:Redis Cluster功能测试,如故障切换的测试(failover.tcl)、副本迁移的测试(replica-migration.tcl)
- sentinel:哨兵功能测试
- integration:主从复制功能测试
其余assets、helpers、modules、support用于支撑测试功能
utils目录
- create-cluster:创建集群工具代码
- graphs:用于生成图(http://antirez.com/news/98)
- hashtable:rehash过程可视化代码
- hyperloglog:hyperloglog误差率计算和展示代码
- lru:用于测试LRU算法效果
- releasetools:发布工具包
- srandmember:绘制srandmember分布,评估公平性