redis 6.0 源码代码整体结构

2022-01-10 09:25:19 浏览数 (1)

redis 6.0 源码代码整体结构

    • 整体结构
      • deps目录
      • src目录
        • 服务器实例
        • 数据库操作
        • 可靠性和可扩展性保证
        • 辅助功能
      • tests目录
      • utils目录

整体结构

在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分布,评估公平性

0 人点赞