如何阅读 Redis 源码?

2023-05-16

在这篇文章中, 我将向大家介绍一种我认为比较合理的 Redis 源码阅读顺序, 希望可以给对 Redis 有兴趣并打算阅读 Redis 源码的朋友带来一点帮助。

第 1 步:阅读数据结构实现

刚开始阅读 Redis 源码的时候, 最好从数据结构的相关文件开始读起, 因为这些文件和 Redis 中的其他部分耦合最少, 并且这些文件所实现的数据结构在大部分算法书上都可以了解到, 所以从这些文件开始读是最轻松的、难度也是最低的。

下表列出了 Redis 源码中, 各个数据结构的实现文件:

文件

内容

sds.h 和 sds.c

Redis 的动态字符串实现。

adlist.h 和 adlist.c

Redis 的双端链表实现。

dict.h 和 dict.c

Redis 的字典实现。

redis.h 中的 zskiplist 结构和 zskiplistNode 结构, 以及 t_zset.c 中所有以 zsl 开头的函数, 比如 zslCreate 、 zslInsert 、 zslDeleteNode ,等等。

Redis 的跳跃表实现。

hyperloglog.c 中的 hllhdr 结构, 以及所有以 hll 开头的函数。

Redis 的 HyperLogLog 实现。

第 2 步:阅读内存编码数据结构实现

在阅读完和数据结构有关的文件之后, 接下来就应该阅读内存编码(encoding)数据结构了。

和普通的数据结构一样, 内存编码数据结构基本上是独立的, 不和其他模块耦合, 但是区别在于:

  • 上一步要读的数据结构, 比如双端链表、字典、HyperLogLog, 在算法书上或者相关的论文上都可以找到资料介绍。

  • 而内存编码数据结构却不容易找到相关的资料, 因为这些数据结构都是 Redis 为了节约内存而专门开发出来的, 换句话说, 这些数据结构都是特制(adhoc)的, 除了 Redis 源码中的文档之外, 基本上找不到其他资料来了解这些特制的数据结构。

不过话又说回来, 虽然内存编码数据结构是 Redis 特制的, 但它们基本都和内存分配、指针操作、位操作这些底层的东西有关, 读者只要认真阅读源码中的文档, 并在有需要时, 画图来分析这些数据结构, 那么要完全理解这些内存编码数据结构的运作原理并不难, 当然这需要花一些功夫。

下表展示了 Redis 源码中, 各个内存编码数据结构的实现文件:

文件

内容

intset.h 和 intset.c

整数集合(intset)数据结构。

ziplist.h 和 ziplist.c

压缩列表(zip list)数据结构。

第 3 步:阅读数据类型实现

在完成以上两个阅读步骤之后, 我们就读完了 Redis 六种不同类型的键(字符串、散列、列表、集合、有序集合、HyperLogLog)的所有底层实现结构了。

接下来, 为了知道 Redis 是如何通过以上提到的数据结构来实现不同类型的键, 我们需要阅读实现各个数据类型的文件, 以及 Redis 的对象系统文件, 这些文件包括:

文件

内容

object.c

Redis 的对象(类型)系统实现。

t_string.c

字符串键的实现。

t_list.c

列表键的实现。

t_hash.c

散列键的实现。

t_set.c

集合键的实现。

t_zset.c 中除 zsl 开头的函数之外的所有函数。

有序集合键的实现。

hyperloglog.c 中所有以 pf 开头的函数。

HyperLogLog 键的实现。

第 4 步:阅读数据库实现相关代码

在读完了 Redis 使用所有底层数据结构, 以及 Redis 是如何使用这些数据结构来实现不同类型的键之后, 我们就可以开始阅读 Redis 里面和数据库有关的代码了, 它们分别是:

文件

内容

redis.h 文件中的 redisDb 结构, 以及 db.c 文件。

Redis 的数据库实现。

notify.c

Redis 的数据库通知功能实现代码。

rdb.h 和 rdb.c

Redis 的 RDB 持久化实现代码。

aof.c

Redis 的 AOF 持久化实现代码。

选读

Redis 有一些独立的功能模块, 这些模块可以在完成第 4 步之后阅读, 它们包括:

文件

内容

redis.h 文件的 pubsubPattern 结构,以及 pubsub.c 文件。

发布与订阅功能的实现。

redis.h 文件的 multiState 结构以及 multiCmd 结构, multi.c 文件。

事务功能的实现。

sort.c

SORT 命令的实现。

bitops.c

GETBIT 、 SETBIT 等二进制位操作命令的实现。

第 5 步:阅读客户端和服务器的相关代码

在阅读完数据库实现代码, 以及 RDB 和 AOF 两种持久化的代码之后, 我们可以开始阅读客户端和 Redis 服务器本身的实现代码, 和这些代码有关的文件是:

文件

内容

ae.c ,以及任意一个 ae_*.c 文件(取决于你所使用的多路复用库)。

Redis 的事件处理器实现(基于 Reactor 模式)。

networking.c

Redis 的网络连接库,负责发送命令回复和接受命令请求, 同时也负责创建/销毁客户端, 以及通信协议分析等工作。

redis.h 和 redis.c 中和单机 Redis 服务器有关的部分。

单机 Redis 服务器的实现。

如果读者能完成以上 5 个阅读步骤的话, 那么恭喜你, 你已经了解了单机的 Redis 服务器是怎样处理命令请求和返回命令回复, 以及是 Redis 怎样操作数据库的了, 这是 Redis 最重要的部分, 也是之后继续阅读多机功能的基础。

选读

Redis 有一些独立的功能模块, 这些模块可以在完成第 5 步之后阅读, 它们包括:

文件

内容

scripting.c

Lua 脚本功能的实现。

slowlog.c

慢查询功能的实现。

monitor.c

监视器功能的实现。

第 6 步:阅读多机功能的实现

在弄懂了 Redis 的单机服务器是怎样运作的之后, 就可以开始阅读 Redis 多机功能的实现代码了, 和这些功能有关的文件为:

文件

内容

replication.c

复制功能的实现代码。

sentinel.c

Redis Sentinel 的实现代码。

cluster.c

Redis 集群的实现代码。

注意, 因为 Redis Sentinel 用到了复制功能的代码, 而集群又用到了复制和 Redis Sentinel 的代码, 所以在阅读这三个模块的时候, 记得先阅读复制模块, 然后阅读 Sentinel 模块, 最后才阅读集群模块, 这样理解起来就会更得心应手。

如果你连这三个模块都读完了的话, 那么恭喜你, 你已经读完了 Redis 单机功能和多机功能的所有代码了!

下图总结了本文介绍的阅读顺序:

digraph { node [shape = plaintext] datastruct [label = "数据结构\n(sds、adlist、dict、t_zset、hyperloglog)"] encoding_datastruct [label = "内存编码数据结构\n(intset、ziplist)"] object [label = "数据类型\n(object、t_string、t_list、t_hash、t_set、t_zset、hyperloglog)"] db [label = "数据库相关\n(db、notify、rdb、aof)"] client_and_server [label = "客户端与服务器相关\n(ae、networking、redis)"] multi_server [label = "多机功能\n(replication、sentinel、cluster)"] // datastruct -> encoding_datastruct -> object -> db -> client_and_server -> multi_server }

结语

Redis 的设计非常简洁、优美、精巧和高效, 任何人只要愿意去阅读它的代码的话, 应该都会有所收获的。

希望这篇文章能够给想要阅读 Redis 代码的朋友们带来一些帮助, 也欢迎各位随时和我讨论 Redis 源码方面的问题, 或者跟我分享各位阅读 Redis 源码的心得和经验。

另外我的 Redis 源码注释 项目以及 《Redis 设计与实现》 一书对于理解 Redis 的源代码应该也会有所帮助, 有兴趣的朋友可以自行了解该项目/书本。

黄健宏(huangz)

2014.7.28

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何阅读 Redis 源码? 的相关文章

  • ImageNet数据集应用

    ImageNet数据集是为了促进计算机图像识别技术的发展而设立的一个大型图像数据集 其图片数量最多 xff0c 分辨率最高 xff0c 含有的类别更多 xff0c 有上千个图像类别 每年ImageNet的项目组织都会举办一场ImageNet
  • vs2017:点F12定义到dll源码

    不要直接引用dll文件 xff0c 在项目中添加引用 xff0c 引用生成dll文件的项目 右键项目名称 gt 点击菜单中的 添加 gt 点击 引用 gt 在弹出窗中点击 解决方案 下的 项目 xff0c 勾选要引用的项目 xff0c 点击
  • Linux安装HDF5及遇到的问题总结

    ubuntu版本 xff1a 16 04 2 64位 从HDF官网 xff08 https support hdfgroup org HDF5 xff09 上下载hdf5 1 8 17 tar gz 简要安装步骤如下 xff1a xff08
  • 【Github教程】史上最全github使用方法:github入门到精通

    初识Github 首先让我们大家一起喊一句 Hello Github YEAH 就是这样 Git是一个分布式的版本控制系统 xff0c 最初由Linus Torvalds编写 xff0c 用作Linux内核代码的管理 在推出后 xff0c
  • Win10系统下提示“系统组策略禁止安装此设备”的解决方案(家庭版无组策略)

    今天客户有台机器 xff0c U盘 移动硬盘都无法识别 xff0c 设备管理器 安装更新驱动显示 xff1a windows已找到设备的驱动程序软件 xff0c 但在试图安装时出现错误 查询信息提示 xff1a 系统策略组禁止安装此设备 请
  • 如何将CentOS Stream退回为CentOS 8.5

    CentOS 8 已于 2021 年年底正式停止维护 xff0c 因业务需要 xff0c 老大说 xff0c 换Steam吧 xff0c 后面环境有问题果然反悔了 xff0c 哈哈 xff0c 怎么办 xff0c 没降级工具哦 xff0c
  • 详解:什么是VXLAN?

    本文介绍了什么是VXLAN xff0c 以及VXLAN的基本概念和工作原理 什么是VXLAN VXLAN xff08 Virtual eXtensible Local Area Network xff0c 虚拟扩展局域网 xff09 xff
  • windows2022远程桌面连接管理员已结束会话解决方法

    您的远程桌面会话已结束 您的远程桌面会话已结束 可能是下列原因之一 管理员已结束了会话 在建立连接时发生错误 发生网络问题 今天有台服务器连不上 xff0c 提示这个 百思不得其解 后面问了 xff0c 原来这台机子装了BT面板 xff0c
  • 樱花大战常见问题解答

    樱花大战1 请使用免CD补丁 还有windows98兼容性 安装目录名字只能用英文 不可以用手柄 使用免CD补丁 还有windows98兼容性可以在XP系统下运行 右键点击樱花大战的启动程序 xff0c 然后 属性 xff0d 兼容性 xf
  • 【小白注意】Windows XP 大胆拥抱Linux系统所遇到的问题

    Windows XP到4月8日就不再有微软的官方技术支持了 xff0c 尽管你仍然可以继续用 xff0c 但是用起来的风险就大多了 xff0c 一不留神就可能被黑客入侵 似乎 xff0c Linux也是一个不错的选择 也许很多文章开始教你如
  • RapeLay(电车之狼R)的结局介绍 (隐藏结局攻略)

    RapeLay xff08 电车之狼R xff09 的结局介绍 隐藏结局 必备知识要让MM怀孕很简单 起初刚进入调教模式后 只要H一次 MM就开始有时期状态 生理 连上有红晕 gt 不详状态 闭目第一次 gt 危险状态 闭目第二 次 只要在
  • 海茶3 らぶデス3 入门经典教程

    又一次在百忙之中给大家写教程了 真的很忙啊 xff0c 4个汉化组 61 1个程序坑 43 1个润色坑 43 2个翻译坑 所以本文第一句话就是 xff1a 这么简单的游戏要什么教程 xff0c 不算LOADGAME xff0c 10分钟上手
  • GALGAME文字提取agth 特殊码大全(特殊码表)和使用方法

    NOTE Make sure you are using the latest version of AGTH 注意 请使用最新版AGTH 大师用的是这个 AGTH 教程也在这里 GALGAME文字提取agth v2008 11 20汉化
  • 70天复习一次通过信息系统项目管理师考试经验和心得

    和我徒弟一样发文纪念下 xff0c 信息系统项目管理师考试45分 xff0c 我报好名 xff0c 开始复习 xff0c 具体时间 xff0c 自己去某网站看 xff0c 上面写着倒计时70天 xff0c 也不知道对不对 把我 一次通过信息
  • 尤菲·如月 与你有约 ぐりぐりキュートユフィ汉化补丁

    游戏名称 xff1a 游戏厂商 xff1a 游戏大小 xff1a 1 98G 游戏语言 xff1a 汉化 发售日期 xff1a 2010年03月20日 是否有喵咪 xff1a 有 3D T Graph GuriGuriCuteYuffie
  • GALGAME引擎识别工具

    神月星人问过一个问题 最近制作RR汉化时碰到解包器难题 xff0c 有程序人员问起星人说RR游戏是用哪个脚本引擎 xff0c 星人一时哑口无言 xff0c 因为星人并不知道如何得知一款游戏的脚本引擎 要怎麽做呢 我做这个脚本引擎识别工具 可
  • 史上最新最全的ADB命令行

    Android开发工具系列目录 Android项目中Git工具的使用史上最全Git命令使用手冊史上最全的ADB命令行Android中的su命令使用Postman测试WebService接口 adb操作及命令 一 ADB的认识1 ADB组成2
  • Redis最佳实践:7个维度+43条使用规范,带你彻底玩转Redis | 附实践清单

    大家好 xff0c 我是 Kaito 这篇文章我想和你聊一聊 Redis 的最佳实践 你的项目或许已经使用 Redis 很长时间了 xff0c 但在使用过程中 xff0c 你可能还会或多或少地遇到以下问题 xff1a 我的 Redis 内存
  • neutron学习笔记

    neutron学习笔记 最近在看openstack xff0c 记录一下neutron一些重要概念 neutron主要组件 1 neutron server 用于实现neutron api和api扩展 xff0c 管理Router netw
  • Ubantu 安装到VMware详解

    想要在VMware中运行Linux系统 xff0c 那么就需要Linux系统安装到VMware虚拟机上面 在这里 xff0c 以把ubantu16 04安装到VMware虚拟机中为教程进行图文讲解 xff0c 共分为三个步骤 xff0c 分

随机推荐