位置: IT常识 - 正文

Redis源码---整体架构(redis zset源码)

编辑:rootadmin
Redis源码---整体架构

目录

前言

Redis目录结构

前言

deps目录

src 目录

tests 目录

utils 目录

重要的配置文件

Redis 功能模块与源码对应

前言

服务器实例

数据库数据类型与操作

高可靠性和高可扩展性

辅助功能


前言以先面后点的方法推进无特殊说明,都是基于 Redis 5.0.8 版本的掌握了 Redis 代码的整体架构,就相当于给 Redis 代码画了张全景图有了这张图,再去学习 Redis 不同功能模块的设计与实现时,就可以从图上快速查找和定位这些功能模块对应的代码文件而且,有了代码的全景图之后,还可以对 Redis 各方面的功能特性有个全面了解,这样也便于更加全面地掌握 Redis 的功能,而不会遗漏某一特性学习 Redis 的代码架构要掌握以下两方面内容:

1--代码的目录结构和作用划分目的是理解 Redis 代码的整体架构,以及所包含的代码功能类别;2--系统功能模块与对应代码文件,目的是了解 Redis 实例提供的各项功能及其相应的实现文件,以便后续深入学习Redis目录结构前言对于 Redis 来说,在它的源码总目录下一共包含了deps、src、tests、utils四个子目录这四个子目录分别对应了 Redis 中发挥不同作用的代码deps目录这个目录主要包含了 Redis 依赖的第三方代码库包括

Redis 的 C 语言版本客户端代码hiredisjemalloc 内存分配器代码readline 功能的替代代码 linenoiselua 脚本代码这部分代码的一个显著特点,就是它们可以独立于 Redis src 目录下的功能源码进行编译也就是说,它们可以独立于 Redis 存在和发展下面这张图显示了 deps 目录下的子目录内容:

那么,为什么在 Redis 源码结构中会有第三方代码库目录呢?其实主要有两方面的原因:一方面

Redis 作为一个用 C 语言写的用户态程序,它的不少功能是依赖于标准的 glibc 库提供的比如内存分配、行读写(readline)、文件读写、子进程/线程创建等但是,glibc库提供的某些功能实现,效率并不高例子:glibc 库中实现的内存分配器的性能就不是很高,它的内存碎片化情况也比较严重因此为了避免对系统性能产生影响,Redis 使用了 jemalloc 库替换了 glibc 库的内存分配器可是,jemalloc 库本身又不属于 Redis 系统自身的功能,把它和 Redis 功能源码放在一个目录下并不合适所以,Redis 使用了专门的 deps 目录来保存这部分代码另一方面

有些功能是 Redis 运行所需要的但是这部分功能又会独立于 Redis 进行开发和演进这种类型最为典型的功能代码,就是 Redis 的客户端代码Redis 作为 Client-Server 架构的系统,访问 Redis 离不开客户端的支撑此外,Redis 自身功能中的命令行 redis-cli、基准测试程序 redis-benchmark 以及哨兵,都需要用到客户端来访问 Redis 实例不过针对客户端的开发,只要保证客户端和实例交互的过程满足 RESP 协议就行客户端和实例的功能可以各自迭代演进所以在 Redis 源码结构中,C 语言版本的客户端hiredis,就被放到了 deps 目录中,以便开发人员自行开发和改进客户端功能总而言之,对于 deps 目录来说只需要记住它主要存放了三类代码:

一是 Redis 依赖的、实现更加高效的功能库,如内存分配二是独立于 Redis 开发演进的代码,如客户端三是 lua 脚本代码src 目录这个目录里面包含了 Redis 所有功能模块的代码文件,也是 Redis 源码的重要组成部分同样,先来看下 src 目录下的子目录结构:可以发现,src 目录下只有一个 modules 子目录,其中包含了一个实现 Redis module 的示例代码剩余的源码文件都是在 src 目录下,没有再分下一级子目录因为 Redis 的功能模块实现是典型的 C 语言风格,不同功能模块之间不再设置目录分隔而是通过头文件包含来相互调用这样的代码风格在基于 C 语言开发的系统软件中,也比较常见,比如 Memcached 的源码文件也是在同一级目录下所以,当使用 C 语言来开发软件系统时,就可以参考 Redis 的功能源码结构,用一个扁平的目录组织所有的源码文件,这样模块相互间的引用也会很方便tests 目录在软件产品的开发过程中,除了第三方依赖库和功能模块源码以外,通常还需要在系统源码中,添加用于功能模块测试和单元测试的代码而在 Redis 的代码目录中,就将这部分代码用一个 tests 目录统一管理了起来Redis 实现的测试代码可以分成四部分,分别是

单元测试(对应 unit 子目录)Redis Cluster 功能测试(对应 cluster 子目录)哨兵功能测试(对应 sentinel 子目录)主从复制功能测试(对应 integration 子目录)这些子目录中的测试代码使用了 Tcl 语言(通用的脚本语言)进行编写,主要目的就是方便进行测试另外,每一部分的测试都是一个测试集合,覆盖了相应功能模块中的多项子功能测试比如:

在单元测试的目录中,可以看到有针对过期 key 的测试(expire.tcl)、惰性删除的测试(lazyfree.tcl),以及不同数据类型操作的测试(type 子目录)等而在 Redis Cluster 功能测试的目录中,可以看到有针对故障切换的测试(failover.tcl)、副本迁移的测试(replica-migration.tcl)等不过在 tests 目录中,除了有针对特定功能模块的测试代码外,还有一些代码是用来支撑测试功能的这些代码在 assets、helpers、modules、support 四个目录中这里有张图,展示了 tests 目录下的代码结构和层次:

utils 目录在 Redis 开发过程中,还有一些功能属于辅助性功能,包括用于创建 Redis Cluster 的脚本、用于测试 LRU 算法效果的程序,以及可视化 rehash 过程的程序在 Redis 代码结构中,这些功能代码都被归类到了 utils 目录中统一管理下图展示了 utils 目录下的主要子目录:

重要的配置文件除了 deps、src、tests、utils 四个子目录以外,Redis 源码总目录下其实还包含了两个重要的配置文件,一个是 Redis 实例的配置文件 redis.conf,另一个是哨兵的配置文件sentinel.conf当需要查找或修改 Redis 实例或哨兵的配置时,就可以直接定位到源码总目录下Redis 功能模块与源码对应前言Redis 代码结构中的 src 目录,包含了实现功能模块的 123 个代码文件在这 123 个代码文件中,对于某个功能来说,一般包括了实现该功能的 C 语言文件(.c 文件)和对应的头文件(.h 文件)比如,dict.c 和 dict.h 就是用于实现哈希表的 C 文件和头文件那么,该如何将这 123 个文件和 Redis 的主要功能对应上呢?其实,Redis 代码文件的命名非常规范,文件名中就体现了该文件实现的主要功能比如,对于 rdb.h 和 rdb.c 这两个代码文件来说,从文件名上,就可以看出来它们是实现内存快照RDB 的对应代码所以这里,为了能快速定位源码,就分别按照 Redis 的服务器实例、数据库操作、可靠性和可扩展性保证、辅助功能四个维度,把 Redis 功能源码梳理成了四条代码路径服务器实例Redis 在运行时是一个网络服务器实例,因此相应地就需要有代码实现服务器实例的初始化和主体控制流程而这是由 server.h/server.c 实现的,Redis 整个代码的 main入口函数也是在 server.c 中如果想了解 Redis 是如何开始运行的,那么就可以从server.c 的 main 函数开始看起当然,对于一个网络服务器来说,它还需要提供网络通信功能Redis 使用了基于事件驱动机制的网络通信框架,涉及的代码文件包括 ae.h/ae.c,ae_epoll.c,ae_evport.c,ae_kqueue.c,ae_select.c关于事件驱动框架的具体设计思路与实现方法,后续会详细介绍而除了事件驱动网络框架以外,与网络通信相关的功能还包括底层 TCP 网络通信和客户端实现Redis 对 TCP 网络通信的 Socket 连接、设置等操作进行了封装,这些封装后的函数实现在anet.h/anet.c 中这些函数在 Redis Cluster 创建和主从复制的过程中,会被调用并用于建立 TCP 连接除此之外,客户端在 Redis 的运行过程中也会被广泛使用,比如实例返回读取的数据、主从复制时在主从库间传输数据、Redis Cluster 的切片实例通信等,都会用到客户端Redis 将客户端的创建、消息回复等功能,实现在了 networking.c 文件中,如果想了解客户端的设计与实现,可以重点看下这个代码文件这里也总结了与服务器实例相关的功能模块及对应的代码文件:数据库数据类型与操作Redis 数据库提供了丰富的键值对类型,其中包括了 String、List、Hash、Set 和 Sorted Set这五种基本键值类型此外,Redis 还支持位图、HyperLogLog、Geo 等扩展数据类型而为了支持这些数据类型,Redis 就使用了多种数据结构来作为这些类型的底层结构比如,String 类型的底层数据结构是 SDS,而 Hash 类型的底层数据结构包括哈希表和压缩列表不过,因为 Redis 实现的底层数据结构非常多,所以这里把这些底层结构和它们对应的键值对类型,以及相应的代码文件列在了下表中,可以用这张表来快速定位代码文件:

除了实现了诸多的数据类型以外,Redis 作为数据库,还实现了对键值对的新增、查询、修改和删除等操作接口,这部分功能是在 db.c 文件实现的当然,Redis 作为内存数据库,其保存的数据量受限于内存大小因此,内存的高效使用对于Redis 来说就非常重要Redis 是如何优化内存使用的呢?实际上,Redis 是从三个方面来优化内存使用的,分别是内存分配、内存回收,以及数据替换首先,在内存分配方面,Redis 支持使用不同的内存分配器,包括 glibc 库提供的默认分配器tcmalloc、第三方库提供的 jemallocRedis 把对内存分配器的封装实现在了zmalloc.h/zmalloc.c其次,在内存回收上,Redis 支持设置过期 key,并针对过期 key 可以使用不同删除策略,这部分代码实现在 expire.c 文件中同时,为了避免大量 key 删除回收内存,会对系统性能产生影响,Redis 在 lazyfree.c 中实现了异步删除的功能所以这样,就可以使用后台 IO线程来完成删除,以避免对 Redis 主线程的影响最后,针对数据替换,如果内存满了,Redis 还会按照一定规则清除不需要的数据,这也是Redis 可以作为缓存使用的原因Redis 实现的数据替换策略有很多种,包括 LRU、LFU 等经典算法这部分的代码实现在了 evict.c 中同样,这里也把和 Redis 数据库数据类型与操作相关的功能模块及代码文件,总结成了一张图:

高可靠性和高可扩展性首先,虽然 Redis 一般是作为内存数据库来使用的,但是它也提供了可靠性保证这主要体现在 Redis 可以对数据做持久化保存,并且它还实现了主从复制机制,从而可以提供故障恢复的功能这部分的代码实现比较集中,主要包括以下两个部分:

1--数据持久化实现

Redis 的数据持久化实现有两种方式:内存快照 RDB 和 AOF 日志,分别实现在了rdb.h/rdb.c 和 aof.c 中注意,在使用 RDB 或 AOF 对数据库进行恢复时,RDB 和 AOF 文件可能会因为 Redis 实例所在服务器宕机,而未能完整保存,进而会影响到数据库恢复因此针对这一问题,Redis 还实现了对这两类文件的检查功能,对应的代码文件分别是 redis-check-rdb.c 和 redis-check-aof.c2--主从复制功能实现

Redis 把主从复制功能实现在了 replication.c 文件中另外还需要知道的是,Redis 的主从集群在进行恢复时,主要是依赖于哨兵机制,而这部分功能则直接实现在了 sentinel.c 文件中其次,与 Redis 实现高可靠性保证的功能类似,Redis 高可扩展性保证的功能,是通过 Redis Cluster 来实现的,这部分代码也非常集中,就是在 cluster.h/cluster.c 代码文件中所以这样在学习 Redis Cluster 的设计与实现时,就会非常方便,不用在不同的文件之间来回跳转了辅助功能Redis 还实现了一些用于支持系统运维的辅助功能比如,为了便于运维人员查看分析不同操作的延迟产生来源,Redis 在latency.h/latency.c 中实现了操作延迟监控的功能为了便于运维人员查找运行过慢的操作命令,Redis 在 slowlog.h/slowlog.c 中实现了慢命令的记录功能,等等此外,运维人员有时还需要了解 Redis 的性能表现,为了支持这一目标,Redis 实现了对系统进行性能评测的功能,这部分代码在 redis-benchmark.c 中
本文链接地址:https://www.jiuchutong.com/zhishi/298980.html 转载请保留说明!

上一篇:阿里通义千问、百度文心一言、ChatGPT与GPT-4大比拼(阿里通义千问官网)

下一篇:HTML 扫盲(html扫码功能)

  • 如何经营好微博获得更多的粉丝(如何经营好微博博主)

    如何经营好微博获得更多的粉丝(如何经营好微博博主)

  • vivox50的红外线功能在哪里(vivox50的红外怎样用)

    vivox50的红外线功能在哪里(vivox50的红外怎样用)

  • 苹果相机的九宫格怎么设置(苹果相机的九宫格怎么设置出来)

    苹果相机的九宫格怎么设置(苹果相机的九宫格怎么设置出来)

  • 华为mate30pro数据网速太慢怎么办(华为mate30pro数据线连接电脑)

    华为mate30pro数据网速太慢怎么办(华为mate30pro数据线连接电脑)

  • ipad弹不出校园网登录(ipad为什么弹不出校园网登录)

    ipad弹不出校园网登录(ipad为什么弹不出校园网登录)

  • 微信怎么置顶到第一个(微信怎么置顶到另一个人)

    微信怎么置顶到第一个(微信怎么置顶到另一个人)

  • 笔记本电脑乘法键在哪(笔记本电脑乘法和除法是哪个按键)

    笔记本电脑乘法键在哪(笔记本电脑乘法和除法是哪个按键)

  • 黑胶和音乐包有什么不同(黑胶跟音乐包)

    黑胶和音乐包有什么不同(黑胶跟音乐包)

  • 华为nova5手机第二个空间怎么弄(华为nova5p手机)

    华为nova5手机第二个空间怎么弄(华为nova5p手机)

  • 群主踢人出微信群别人能看到吗(微信群主踢人,被踢者知道吗)

    群主踢人出微信群别人能看到吗(微信群主踢人,被踢者知道吗)

  • 打开volte是什么意思(打开volte开关)

    打开volte是什么意思(打开volte开关)

  • 电脑上全选是哪两个键(电脑上全选是哪个快捷键)

    电脑上全选是哪两个键(电脑上全选是哪个快捷键)

  • 手机来电不显示号码是怎么回事(手机来电不显示来电屏幕)

    手机来电不显示号码是怎么回事(手机来电不显示来电屏幕)

  • 苹果降级数据还在不在(苹果降级了还有资料吗)

    苹果降级数据还在不在(苹果降级了还有资料吗)

  • word2010底纹填充颜色(word底纹填充色怎么设置)

    word2010底纹填充颜色(word底纹填充色怎么设置)

  • 华为p30pro的特殊功能(华为p30pro特殊颜色)

    华为p30pro的特殊功能(华为p30pro特殊颜色)

  • 快手收货地址在哪里看(快手里的收货地址)

    快手收货地址在哪里看(快手里的收货地址)

  • 苹果x没有面容什么意思(苹果x没有面容是怎么回事)

    苹果x没有面容什么意思(苹果x没有面容是怎么回事)

  • 苹果手机怎么运行诊断(苹果手机怎么运镜)

    苹果手机怎么运行诊断(苹果手机怎么运镜)

  • 小米6通话声音小怎么办(小米6通话声音小怎么调)

    小米6通话声音小怎么办(小米6通话声音小怎么调)

  • 快手直播买东西怎么退(快手直播买东西微信支付用不了怎么回事)

    快手直播买东西怎么退(快手直播买东西微信支付用不了怎么回事)

  • 苹果x怎么恢复微信聊天记录(苹果x怎么恢复出厂设置)

    苹果x怎么恢复微信聊天记录(苹果x怎么恢复出厂设置)

  • excel单元格文字溢出(excel单元格文字行距如何调整)

    excel单元格文字溢出(excel单元格文字行距如何调整)

  • 微信文件怎么做(微信文件怎么做压缩包)

    微信文件怎么做(微信文件怎么做压缩包)

  • 用sudo命令无法读取环境变量的解决方法(sudo命令无法执行)

    用sudo命令无法读取环境变量的解决方法(sudo命令无法执行)

  • 火遍全网的chatGPT(火遍全网的超燃神曲旋律震撼人心,听完热血沸腾!)

    火遍全网的chatGPT(火遍全网的超燃神曲旋律震撼人心,听完热血沸腾!)

  • DNN(全连接神经网络)(全连接神经网络是什么意思)

    DNN(全连接神经网络)(全连接神经网络是什么意思)

  • 违约金的专票能抵扣吗
  • 电费为什么计入成本费用
  • 生产企业发票单位
  • 租赁财产的残值处理
  • 制造业三项费用占比行业怎么算
  • 进口环节应纳消费税的组成计税价格
  • 发票报销的条件是什么?
  • 开立基本账户所需资料
  • 存货暂估入账会引起存货账面价值发生增减变动吗
  • 公司团建活动奖状模板
  • 二季度支出小于一季度什么意思
  • 辞退福利怎么交税
  • 个人出租场地个人所得税
  • 自己种的苗木开发票要什么手续
  • 报销单据粘贴单图片
  • 企业收到银行利息收入2000元会计分录
  • 存商品入成原材料怎么改?
  • 职工教育经费不提可以吗
  • mac怎么设置不自动开机
  • 暂估成本的会计处理
  • 税盘的服务费
  • 应收账款的差额计入哪里
  • 商贸企业零部件出口退税政策
  • 金税四期查到了怎么办
  • 交城建税的滞纳金是多少
  • 其他综合收益是什么意思
  • 核定征收的企业怎么交所得税
  • php ftp管理系统
  • 投资性房地产出售
  • 境外代扣代缴企业所得税的计税依据包含企业所得税嘛
  • 销售产品是销项税额还是进项税额
  • 资产负债表的编制方法和步骤
  • PHP:mcrypt_ofb()的用法_Mcrypt函数
  • php redis实现秒杀思路
  • vue 的watch
  • 企业自查补税怎么报税
  • HTML+CSS+JavaScript仿京东购物商城网站 web前端制作服装购物商城 html电商购物网站
  • 时间序列模型ARIMA的优缺点
  • php点运算符
  • 餐饮企业原材料成本如何分析
  • 进项发票和销项发票统计
  • 开具劳务发票需要提供什么资料?
  • python中列表的作用
  • 预付款为什么不扣质保金呢
  • 一般纳税人会计做账的基本流程
  • 税控系统减免税
  • 土增尾盘销售应该如何申报收入
  • 借别人账户过钱
  • 已认证未申报抵扣怎么办
  • 港币转人民币差多少钱
  • 收到赠送的样品附件
  • 如何计算政府补贴应摊销
  • 付款申请单如何转填记账凭证
  • 购买材料如何计提折旧
  • 2020年专项扣除怎么填
  • 计提工资和发放工资的账务处理
  • 固定资产原价是指固定资产的什么
  • 哪些固定资产不计提折旧
  • sql自定义变量
  • win7隐藏共享文件夹
  • win7系统开机后黑屏只有鼠标指针可以移动
  • 误删了分区怎么恢复
  • win1020h2更新卡在1
  • win7系统插u盘没反应怎么办
  • lnmp php
  • win7电脑浏览器怎么设置默认浏览器
  • windows vhd
  • cocos2d-x教程
  • opengl颜色混合模式
  • Node.js中的事件循环是什么
  • vue2.0与bootstrap3实现列表分页效果
  • centos 安装pip3
  • js格式化输出数字
  • python如何切行
  • jquery页面布局
  • 四川省国家税务局电子税务局
  • 出口企业的增值税怎么算
  • 爱信诺开票系统怎么安装
  • 税服领花规范照片
  • 内蒙古个人所得税app下载
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设