redis-3.0-annotated README

The project's README from github.com/huangzworks/redis-3.0-annotated. As one markdown file: README.md.

Redis 3.0 源码注释

本项目是注释版的 Redis 3.0 源码, 原始代码来自: https://github.com/antirez/redis 。

这份注释是我在创作新版《Redis 设计与实现》期间, 为了了解 Redis 的内部实现而制作的, 所有在书中有介绍的内容, 在源码中都进行了相应的注释。

在注释的过程中, 除了少量空格和空行方面的调整外, 没有对原始代码进行任何其他改动, 最大程度地保证了代码的“原汁原味”。

希望这份注释源码能给大家学习和了解 Redis 带来一点帮助。

另外, 新版《Redis 设计与实现》 <http://RedisBook.com>_\ 正在各大网店发售中, 希望大家可以多多支持这本书。

Have fun!

| 黄健宏(huangz) | 2014 年 6 月 28 日

附录:各个源码文件的作用简介

+-------------------------------------------------------------------+-------------------------------------------------------------------+ | 文件 | 作用 | +===================================================================+===================================================================+ | adlist.c 、 adlist.h | 双端链表数据结构的实现。 | +-------------------------------------------------------------------+-------------------------------------------------------------------+ | ae.c 、 ae.h 、 ae_epoll.c 、 ae_evport.c 、 | 事件处理器,以及各个具体实现。 | | ae_kqueue.c 、 ae_select.c | | +-------------------------------------------------------------------+-------------------------------------------------------------------+ | anet.c 、 anet.h | Redis 的异步网络框架,内容主要为对 socket 库的包装。 | +-------------------------------------------------------------------+-------------------------------------------------------------------+ | aof.c | AOF 功能的实现。 | +-------------------------------------------------------------------+-------------------------------------------------------------------+ | asciilogo.h | 保存了 Redis 的 ASCII LOGO 。 | +-------------------------------------------------------------------+-------------------------------------------------------------------+ | bio.c 、 bio.h | Redis 的后台 I/O 程序,用于将 I/O 操作放到子线程里面执行, | | | 减少 I/O 操作对主线程的阻塞。 | +-------------------------------------------------------------------+-------------------------------------------------------------------+ | bitops.c | 二进制位操作命令的实现文件。 | +-------------------------------------------------------------------+-------------------------------------------------------------------+ | blocked.c | 用于实现 BLPOP 命令和 WAIT 命令的阻塞效果。 | +-------------------------------------------------------------------+-------------------------------------------------------------------+ | cluster.c 、 cluster.h | Redis 的集群实现。 | +-------------------------------------------------------------------+-------------------------------------------------------------------+ | config.c 、 config.h | Redis 的配置管理实现,负责读取并分析配置文件, | | | 然后根据这些配置修改 Redis 服务器的各个选项。 | +-------------------------------------------------------------------+-------------------------------------------------------------------+ | crc16.c 、 crc64.c 、 crc64.h | 计算 CRC 校验和。 | +-------------------------------------------------------------------+-------------------------------------------------------------------+ | db.c | 数据库实现。 | +-------------------------------------------------------------------+-------------------------------------------------------------------+ | debug.c | 调试实现。 | +-------------------------------------------------------------------+-------------------------------------------------------------------+ | dict.c 、 dict.h | 字典数据结构的实现。 | +-------------------------------------------------------------------+-------------------------------------------------------------------+ | endianconv.c 、 endianconv.h | 二进制的大端、小端转换函数。 | +-------------------------------------------------------------------+-------------------------------------------------------------------+ | fmacros.h | 一些移植性方面的宏。 | +-------------------------------------------------------------------+-------------------------------------------------------------------+ | help.h | utils/generate-command-help.rb 程序自动生成的命令帮助信息。 | +-------------------------------------------------------------------+-------------------------------------------------------------------+ | hyperloglog.c | HyperLogLog 数据结构的实现。 | +-------------------------------------------------------------------+-------------------------------------------------------------------+ | intset.c 、 intset.h | 整数集合数据结构的实现,用于优化 SET 类型。 | +-------------------------------------------------------------------+-------------------------------------------------------------------+ | lzf_c.c 、 lzf_d.c 、 lzf.h 、 lzfP.h | Redis 对字符串和 RDB 文件进行压缩时使用的 LZF 压缩算法的实现。 | +-------------------------------------------------------------------+-------------------------------------------------------------------+ | Makefile 、 Makefile.dep | 构建文件。 | +-------------------------------------------------------------------+-------------------------------------------------------------------+ | memtest.c | 内存测试。 | +-------------------------------------------------------------------+-------------------------------------------------------------------+ | mkreleasehdr.sh | 用于生成释出信息的脚本。 | +-------------------------------------------------------------------+-------------------------------------------------------------------+ | multi.c | Redis 的事务实现。 | +-------------------------------------------------------------------+-------------------------------------------------------------------+ | networking.c | Redis 的客户端网络操作库, | | | 用于实现命令请求接收、发送命令回复等工作, | | | 文件中的函数大多为 write 、 read 、 close 等函数的包装, | | | 以及各种协议的分析和构建函数。 | +-------------------------------------------------------------------+-------------------------------------------------------------------+ | notify.c | Redis 的数据库通知实现。 | +-------------------------------------------------------------------+-------------------------------------------------------------------+ | object.c | Redis 的对象系统实现。 | +-------------------------------------------------------------------+-------------------------------------------------------------------+ | pqsort.c 、 pqsort.h | 快速排序(QuickSort)算法的实现。 | +-------------------------------------------------------------------+-------------------------------------------------------------------+ | pubsub.c | 发布与订阅功能的实现。 | +-------------------------------------------------------------------+-------------------------------------------------------------------+ | rand.c 、 rand.h | 伪随机数生成器。 | +-------------------------------------------------------------------+-------------------------------------------------------------------+ | rdb.c 、 rdb.h | RDB 持久化功能的实现。 | +-------------------------------------------------------------------+-------------------------------------------------------------------+ | redisassert.h | Redis 自建的断言系统。 | +-------------------------------------------------------------------+-------------------------------------------------------------------+ | redis-benchmark.c | Redis 的性能测试程序。 | +-------------------------------------------------------------------+-------------------------------------------------------------------+ | redis.c | 负责服务器的启动、维护和关闭等事项。 | +-------------------------------------------------------------------+-------------------------------------------------------------------+ | redis-check-aof.c 、 redis-check-dump.c | RDB 文件和 AOF 文件的合法性检查程序。 | +-------------------------------------------------------------------+-------------------------------------------------------------------+ | redis-cli.c | Redis 客户端的实现。 | +-------------------------------------------------------------------+-------------------------------------------------------------------+ | redis.h | Redis 的主要头文件,记录了 Redis 中的大部分数据结构, | | | 包括服务器状态和客户端状态。 | +-------------------------------------------------------------------+-------------------------------------------------------------------+ | redis-trib.rb | Redis 集群的管理程序。 | +-------------------------------------------------------------------+-------------------------------------------------------------------+ | release.c 、 release.h | 记录和生成 Redis 的释出版本信息。 | +-------------------------------------------------------------------+-------------------------------------------------------------------+ | replication.c | 复制功能的实现。 | +-------------------------------------------------------------------+-------------------------------------------------------------------+ | rio.c 、 rio.h | Redis 对文件 I/O 函数的包装, | | | 在普通 I/O 函数的基础上增加了显式缓存、以及计算校验和等功能。 | +-------------------------------------------------------------------+-------------------------------------------------------------------+ | scripting.c | 脚本功能的实现。 | +-------------------------------------------------------------------+-------------------------------------------------------------------+ | sds.c 、 sds.h | SDS 数据结构的实现,SDS 为 Redis 的默认字符串表示。 | +-------------------------------------------------------------------+-------------------------------------------------------------------+ | sentinel.c | Redis Sentinel 的实现。 | +-------------------------------------------------------------------+-------------------------------------------------------------------+ | setproctitle.c | 进程环境设置函数。 | +-------------------------------------------------------------------+-------------------------------------------------------------------+ | sha1.c 、 sha1.h | SHA1 校验和计算函数。 | +-------------------------------------------------------------------+-------------------------------------------------------------------+ | slowlog.c 、 slowlog.h | 慢查询功能的实现。 | +-------------------------------------------------------------------+-------------------------------------------------------------------+ | solarisfixes.h | 针对 Solaris 系统的补丁。 | +-------------------------------------------------------------------+-------------------------------------------------------------------+ | sort.c | SORT 命令的实现。 | +-------------------------------------------------------------------+-------------------------------------------------------------------+ | syncio.c | 同步 I/O 操作。 | +-------------------------------------------------------------------+-------------------------------------------------------------------+ | testhelp.h | 测试辅助宏。 | +-------------------------------------------------------------------+-------------------------------------------------------------------+ | t_hash.c 、 t_list.c 、 t_set.c 、 t_string.c 、 | 定义了 Redis 的各种数据类型,以及这些数据类型的命令。 | | t_zset.c | | +-------------------------------------------------------------------+-------------------------------------------------------------------+ | util.c 、 util.h | 各种辅助函数。 | +-------------------------------------------------------------------+-------------------------------------------------------------------+ | valgrind.sup | valgrind 的suppression文件。 | +-------------------------------------------------------------------+-------------------------------------------------------------------+ | version.h | 记录了 Redis 的版本号。 | +-------------------------------------------------------------------+-------------------------------------------------------------------+ | ziplist.c 、 ziplist.h | ZIPLIST 数据结构的实现,用于优化 LIST 类型。 | +-------------------------------------------------------------------+-------------------------------------------------------------------+ | zipmap.c 、 zipmap.h | ZIPMAP 数据结构的实现,在 Redis 2.6 以前用与优化 HASH 类型, | | | Redis 2.6 开始已经废弃。 | +-------------------------------------------------------------------+-------------------------------------------------------------------+ | zmalloc.c 、 zmalloc.h | 内存管理程序。 | +-------------------------------------------------------------------+-------------------------------------------------------------------+

redis-3.0-annotated (huangzworks/redis-3.0-annotated)

Searching Database…

这是什么?这是在原版 Redis 3.0 源码基础上加了详细中文注释的版本,用中文讲解 Redis 内部的工作原理——它是一份用来学习的代码副本,而不是一个新工具。
这是一个可以部署的 Redis 分支,还是一份用来阅读的源码副本?这是一份用来阅读的副本,不是可以部署的分支:除了新增的注释,只改动了个别空格和空行,代码与上游 Redis 保持一致。
我怎么获取它并开始学习?克隆这个仓库,然后阅读 C 源码文件,并借助 README 里的附录当地图——附录里有一张表,说明了每个源码文件的用途,从 dict.c(哈希表)到 cluster.c(集群)。
我需要会多少 C 语言才能看懂它?必须能比较顺畅地阅读 C 代码——注释讲解的是 Redis 的设计,而不是语言本身。如果熟悉哈希表、链表这类经典数据结构,读起来会轻松很多。
这是基于较新版本的 Redis 吗?不是——它固定在 Redis 3.0,注释完成于 2014 年 6 月。这对学习那些经典且至今仍是基础的内部机制很合适,但 Redis 3.0 之后新增的内容都没有涉及。
我需要懂中文才能从中受益吗?实际上需要:注释、README 和文件附录全部是中文写的。代码本身是标准的 C 语言,所以无论怎样你都可以浏览代码,但所有讲解都是中文的。
作者为什么要给整个代码库加注释?这些注释是他在撰写《Redis 设计与实现》新版时整理的——书中讲到的每个主题,都在源码对应的位置上做了注释。
它讲解了 Redis 的哪些部分?涵盖书中讨论的所有内容:SDS 字符串、字典、链表、压缩列表和 HyperLogLog 等核心数据结构,以及事件循环、网络、RDB 和 AOF 持久化、复制、事务、Pub/Sub、脚本、Sentinel 和集群。
我可以像正常的 Redis 一样编译运行这份代码吗?可以——仓库里保留了原来的构建文件,所以它和任何 Redis 3.0 代码一样,用 make 就能构建。不过这个项目的定位是阅读源码,而不是用于实际部署。
Size
5.8 MB
Stars
10.1K
Updated
CommitJun 02
Age
12y
Commits · 90 Days