前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >redis 6.0 源码代码整体结构

redis 6.0 源码代码整体结构

作者头像
lovelife110
发布2022-01-10 09:25:19
4040
发布2022-01-10 09:25:19
举报
文章被收录于专栏:爱生活爱编程爱生活爱编程

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分布,评估公平性
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-12-24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • redis 6.0 源码代码整体结构
  • 整体结构
    • deps目录
      • src目录
        • 服务器实例
        • 数据库操作
        • 可靠性和可扩展性保证
        • 辅助功能
      • tests目录
        • utils目录
        相关产品与服务
        云数据库 Redis
        腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档