[预告] [3月8日] 《Redis 设计与实现》
3 月 8 日更新:书籍已发布,请访问 http://www.redisbook.com/ 阅读。
---
自从开始在博客断断续续地写一些 Redis 的源码分析文章以来,我一直有这样一个打算:不是间隔地、分多次地写多篇 Redis 的源码分析文章,而是抽出一段时间,对 Redis 的源码做一次完整的分析,并将其中的关键点、以及有趣的部分记录下来,集结成一个文档(或者更通俗地说,一本书?)。
我在 2012 年 12 月开始将“Redis 源码书”的这个想法付诸实现,并且很幸运地在今天完成初稿了。
我把这本“Redis 源码书”命名为《Redis 设计与实现》,它由两部分组成:
1. 一个文档,描述了 Redis 源码中,各个功能点的关键实现,核心数据结构和算法,以及设计上的取舍。
2. 一份 Redis 2.6 的源码,源码中的大部分文件都带有详细的注释。(3月5日更新,带注释源码已放出 https://github.com/huangz1990/annotated_redis_source )
在文档部分,我尽力地将 Redis 各个功能的运行机制从代码中抽离出来,并通过简短的文字、图片、流程图和表格来表示这些机制,只有在需要的时候,才会贴少量的伪代码或者源代码。这可以保证文档中记录的都是高层次的设计观点 —— 读者可以很轻松地理解 Redis 的运行原理,而无须和源码中的各种实现细节打交道。
另一方面,我认为一份带有完整注释的源代码对于深入地学习 Redis 也是很有用的:对于那些对 Redis 的运作机制感兴趣、但又不想陷入到源码细节中的读者来说,他们只需要阅读文档就可以了;而对于那些更有好奇心,需要深入到源码中去的读者来说,文档的作用就像夜空中的北斗星一样,可以为他们指明总体方向,而源码中的注释则像路标一样,给出一些如何前进的线索。
对初稿的 debug 和最后修改还需要一些时间,如果一切顺利的话,文档第一版将在妇女节当天释出,希望这个新文档会对喜欢 Redis 的朋友有帮助,也欢迎各位到时对文档提意见或建议。嗯。
huangz
2013.2.28
以下是文档的目录(正式发布时可能会有小改动):
第一部分:内部数据结构
=======================
动态字符串 —— Simple Dynamic String (sds)
----------------------------------------------------------------------------
Redis 中的字符串
sds 的实现
通过 sds 来持有 sdshdr 结构
优化追加操作
sds.c 模块的其他函数
双端链表 —— Adlist
---------------------------------------------------
关于双端链表
双端链表的实现
迭代器
字典 —— Dict
---------------------------------------
字典数据结构及其操作
字典的实现
哈希算法
创建新字典
添加键值对到字典
碰撞处理
Rehash
渐进式 rehash
其他操作
字典的迭代
跳跃表 —— Skiplist
---------------------------------------------
跳跃表的应用
跳跃表的实现
小结
第二部分:内存映射数据结构
============================
整数集合 —— intset
-------------------------------------------------
数据结构和主要操作
intset 运行实例
升级
关于升级
关于元素移动
其他操作
小结
压缩列表 —— ziplist
------------------------------------------------------
ziplist 的构成
节点的构成
创建新 ziplist
将节点添加到末端
将节点添加到某个/某些节点的前面
删除节点
遍历
查找元素、根据值定位节点
第三部分:Redis 数据类型
==========================================
对象处理机制 —— Redis Object
-------------------------------------------------------------
redisObject 数据结构,以及 Redis 的数据类型
命令的多态
对象共享
引用计数以及对象的销毁
字符串 —— String
---------------------------------
哈希表 —— Hash
---------------------------------
列表 —— List
-----------------------------------
阻塞的条件
阻塞
阻塞因 LPUSH 、 RPUSH 、 LINSERT 等添加命令而被取消
先阻塞先服务(FBFS)策略
阻塞因超过最大等待时间而被取消
集合 —— Set
---------------------------------------
求交集算法
求并集算法
求差集算法
有序集 —— SortedSet
------------------------------------------
有序集的创建
编码的转换
ZIPLIST 编码
SKIPLIST 编码
第四部分:功能的实现
===========================
事务
------------------------
事务
开始事务
命令入队
执行事务
在事务和非事务状态下执行命令
事务状态下的 DISCARD 、 MULTI 和 WATCH 命令
带 WATCH 的事务
WATCH 命令的实现
WATCH 的触发
事务的 ACID 性质
小结
订阅与发布
-------------------------------
频道的订阅与信息发送
订阅频道
发送信息到频道
退订频道
模式的订阅与信息发送
订阅模式
发送信息到模式
退订模式
小结
Lua 脚本
-------------------------
初始化 Lua 环境
脚本的安全性
脚本的执行
EVAL 命令的实现
EVALSHA 命令的实现
小结
慢查询报告 —— slowlog
-----------------------------------------------------
慢查询日志
慢查询日志的记录
慢查询日志的操作
第五步分:内部运作机制
=============================
数据库
---------------------------------------------------------------
数据库的结构
数据库的切换
数据库键空间
键空间的操作
键的生存时间
生存时间的保存
设置生存时间
过期键的判定
过期键的清除
过期键的惰性删除策略
过期键的定期删除策略
过期键对 AOF 、RDB 和复制的影响
数据库空间的收缩和扩展
小结
RDB
--------------------------------------------------------------------------------
保存
SAVE 、 BGSAVE 、 AOF 写入和 BGREWRITEAOF
载入
RDB 文件结构
小结
AOF
----------------------------------------------------------------------------------
AOF 命令同步
命令传播
缓存追加
文件写入和保存
AOF 保存模式
AOF 保存模式对性能和安全性的影响
AOF 文件的读取和数据还原
AOF 重写
AOF 重写的实现
AOF 后台重写
AOF 后台重写的触发条件
小结
事件
--------------------------------------------------------------------------------------
文件事件
时间事件
时间事件应用实例:服务器常规操作
事件的执行与调度
小结
服务器与客户端
---------------------------------------------------------------------------------------
初始化服务器
客户端连接到服务器
命令的请求、处理和结果返回
命令请求实例: SET 的执行过程
小结
附录
--------------------------------------------------------------------------------------------
内部模块
参考资料
---
自从开始在博客断断续续地写一些 Redis 的源码分析文章以来,我一直有这样一个打算:不是间隔地、分多次地写多篇 Redis 的源码分析文章,而是抽出一段时间,对 Redis 的源码做一次完整的分析,并将其中的关键点、以及有趣的部分记录下来,集结成一个文档(或者更通俗地说,一本书?)。
我在 2012 年 12 月开始将“Redis 源码书”的这个想法付诸实现,并且很幸运地在今天完成初稿了。
我把这本“Redis 源码书”命名为《Redis 设计与实现》,它由两部分组成:
1. 一个文档,描述了 Redis 源码中,各个功能点的关键实现,核心数据结构和算法,以及设计上的取舍。
2. 一份 Redis 2.6 的源码,源码中的大部分文件都带有详细的注释。(3月5日更新,带注释源码已放出 https://github.com/huangz1990/annotated_redis_source )
在文档部分,我尽力地将 Redis 各个功能的运行机制从代码中抽离出来,并通过简短的文字、图片、流程图和表格来表示这些机制,只有在需要的时候,才会贴少量的伪代码或者源代码。这可以保证文档中记录的都是高层次的设计观点 —— 读者可以很轻松地理解 Redis 的运行原理,而无须和源码中的各种实现细节打交道。
另一方面,我认为一份带有完整注释的源代码对于深入地学习 Redis 也是很有用的:对于那些对 Redis 的运作机制感兴趣、但又不想陷入到源码细节中的读者来说,他们只需要阅读文档就可以了;而对于那些更有好奇心,需要深入到源码中去的读者来说,文档的作用就像夜空中的北斗星一样,可以为他们指明总体方向,而源码中的注释则像路标一样,给出一些如何前进的线索。
对初稿的 debug 和最后修改还需要一些时间,如果一切顺利的话,文档第一版将在妇女节当天释出,希望这个新文档会对喜欢 Redis 的朋友有帮助,也欢迎各位到时对文档提意见或建议。嗯。
huangz
2013.2.28
以下是文档的目录(正式发布时可能会有小改动):
第一部分:内部数据结构
=======================
动态字符串 —— Simple Dynamic String (sds)
----------------------------------------------------------------------------
Redis 中的字符串
sds 的实现
通过 sds 来持有 sdshdr 结构
优化追加操作
sds.c 模块的其他函数
双端链表 —— Adlist
---------------------------------------------------
关于双端链表
双端链表的实现
迭代器
字典 —— Dict
---------------------------------------
字典数据结构及其操作
字典的实现
哈希算法
创建新字典
添加键值对到字典
碰撞处理
Rehash
渐进式 rehash
其他操作
字典的迭代
跳跃表 —— Skiplist
---------------------------------------------
跳跃表的应用
跳跃表的实现
小结
第二部分:内存映射数据结构
============================
整数集合 —— intset
-------------------------------------------------
数据结构和主要操作
intset 运行实例
升级
关于升级
关于元素移动
其他操作
小结
压缩列表 —— ziplist
------------------------------------------------------
ziplist 的构成
节点的构成
创建新 ziplist
将节点添加到末端
将节点添加到某个/某些节点的前面
删除节点
遍历
查找元素、根据值定位节点
第三部分:Redis 数据类型
==========================================
对象处理机制 —— Redis Object
-------------------------------------------------------------
redisObject 数据结构,以及 Redis 的数据类型
命令的多态
对象共享
引用计数以及对象的销毁
字符串 —— String
---------------------------------
哈希表 —— Hash
---------------------------------
列表 —— List
-----------------------------------
阻塞的条件
阻塞
阻塞因 LPUSH 、 RPUSH 、 LINSERT 等添加命令而被取消
先阻塞先服务(FBFS)策略
阻塞因超过最大等待时间而被取消
集合 —— Set
---------------------------------------
求交集算法
求并集算法
求差集算法
有序集 —— SortedSet
------------------------------------------
有序集的创建
编码的转换
ZIPLIST 编码
SKIPLIST 编码
第四部分:功能的实现
===========================
事务
------------------------
事务
开始事务
命令入队
执行事务
在事务和非事务状态下执行命令
事务状态下的 DISCARD 、 MULTI 和 WATCH 命令
带 WATCH 的事务
WATCH 命令的实现
WATCH 的触发
事务的 ACID 性质
小结
订阅与发布
-------------------------------
频道的订阅与信息发送
订阅频道
发送信息到频道
退订频道
模式的订阅与信息发送
订阅模式
发送信息到模式
退订模式
小结
Lua 脚本
-------------------------
初始化 Lua 环境
脚本的安全性
脚本的执行
EVAL 命令的实现
EVALSHA 命令的实现
小结
慢查询报告 —— slowlog
-----------------------------------------------------
慢查询日志
慢查询日志的记录
慢查询日志的操作
第五步分:内部运作机制
=============================
数据库
---------------------------------------------------------------
数据库的结构
数据库的切换
数据库键空间
键空间的操作
键的生存时间
生存时间的保存
设置生存时间
过期键的判定
过期键的清除
过期键的惰性删除策略
过期键的定期删除策略
过期键对 AOF 、RDB 和复制的影响
数据库空间的收缩和扩展
小结
RDB
--------------------------------------------------------------------------------
保存
SAVE 、 BGSAVE 、 AOF 写入和 BGREWRITEAOF
载入
RDB 文件结构
小结
AOF
----------------------------------------------------------------------------------
AOF 命令同步
命令传播
缓存追加
文件写入和保存
AOF 保存模式
AOF 保存模式对性能和安全性的影响
AOF 文件的读取和数据还原
AOF 重写
AOF 重写的实现
AOF 后台重写
AOF 后台重写的触发条件
小结
事件
--------------------------------------------------------------------------------------
文件事件
时间事件
时间事件应用实例:服务器常规操作
事件的执行与调度
小结
服务器与客户端
---------------------------------------------------------------------------------------
初始化服务器
客户端连接到服务器
命令的请求、处理和结果返回
命令请求实例: SET 的执行过程
小结
附录
--------------------------------------------------------------------------------------------
内部模块
参考资料
热门话题 · · · · · · ( 去话题广场 )
- 收集春天的季节性快乐时刻 731.6万次浏览
- 春天的影像诗 新话题 · 1.7万次浏览
- 译者生存实录 260次浏览
- 我在春天的随手读 1620次浏览
- 我有独特的语言学习技巧 40.9万次浏览
- 我的炒股经历 84.4万次浏览