《Redis 设计与实现》图片集¶
你好, 欢迎光临《Redis 设计与实现》图片集!
这里列出了 《Redis 设计与实现》 一书包含的绝大多数图片, 并且所有图片的源码都可以在 github.com/huangz1990/redisbook1e-gallery 项目的相应文件中找到 (源码使用 dot 语言编写,由 Graphviz 生成)。
你可以在你的博客文章、笔记甚至是演讲稿里面使用这些图片, 或者通过阅读图片的源码来学习如何使用 dot 语言和 Graphviz 。
所有图片和源码都采用 CC BY-NC 4.0 协议 进行许可, 你只要说明这些材料来源于《Redis 设计与实现》(或者添加一个指向 RedisBook.com 的链接), 就可以以非商业目的随意地使用这些材料。
如果有任何疑问, 请通过 huangz.me 上面列出的联系方式来联系我。
第 4 章:字典¶
一个空的哈希表。
使用链地址法解决冲突的哈希表。
普通状态下(未在进行 rehash)的字典。
包含了键值对的字典。
字典的 rehash 过程。
字典的渐进式 rehash 过程。
第 6 章:整数集合¶
一个整数集合示例,包含五个 int16_t
类型的整数值。
另一个整数集合示例,包含四个 int64_t
类型的整数值。
当向一个包含三个 int16_t
类型的值的整数集合添加一个 int32_t
类型的值时,
整数集合的扩展和转换过程。
第 7 章:压缩列表¶
压缩列表的各个部分
一个包含三个节点的压缩列表示例。
一个包含五个节点的压缩列表示例。
压缩列表节点的各个组成部分。
压缩列表节点的 previous_entry_length
属性示例。
使用压缩列表节点的 previous_entry_length
属性遍历整个压缩列表的过程。
一个保存着 "hello world"
字符串的压缩列表节点示例。
一个保存着整数 10086
的压缩列表节点示例。
向压缩列表添加新节点并引发连锁更新的过程。
第 8 章:对象¶
第 10 章:RDB 持久化¶
Redis 服务器数据库示例。
Redis 保存和载入 RDB 文件的流程。
自动间隔性保存¶
记录了服务器触发自动 BGSAVE
条件的 saveparams
属性。
记录服务器最后一次执行 SAVE
或者 BGSAVE
的时间,
以及自最后一次保存 RDB 文件以来,
服务器进行了多少次写入的 lastsave
属性和 dirty
属性。
用于记录和检查服务器是否需要自动执行 BGSAVE
的相关属性和数据结构的示例。
RDB 文件结构¶
RDB 文件的总体结构。
包含数据库 0
和数据库 3
的非空 RDB 文件结构示例。
RDB 文件中的数据库结构。
示例。
包含了数据库部分的 RDB 文件示例。
不带过期时间的键值对结构。
示例。
带有过期时间的键值对结构。
示例。
int
编码的字符串对象的结构。
示例。
内容没有被压缩的字符串对象的结构。
示例。
内容被压缩后的字符串对象的结构。
示例,
其中 ?
代表的是无法用字符串形式打印出来的字节。
列表对象的结构。
示例。
集合对象的结构。
示例。
哈希对象的结构。
更详细的哈希对象结构。
示例。
有序集合对象结构。
更详细的有序集合对象结构。
示例。
第 11 章: AOF 持久化¶
Redis 服务器在进行 AOF 持久化时, 客户端、服务器与 AOF 文件之间的互动。
AOF 文件的载入过程。
在进行 AOF 重写时, 服务器会同时将命令发送给 AOF 文件和 AOF 重写缓冲区。
第 12 章: 事件¶
Redis 的文件事件处理器的四个组成部分。
I/O 多路复用程序通过队列向文件事件分派器传送套接字的过程。
Redis 的 I/O 多路复用程序有多个 I/O 多路复用库可选。
客户端与服务器通过事件应答来进行通信的过程。
时间事件示例。
事件处理角度下的 Redis 服务器运行流程。
第 13 章: 客户端¶
三个连接到服务器的客户端。
这三个客户端在服务器状态 clients
属性中的样子。
Redis 客户端的输入缓冲区示例。
Redis 客户端的 argv
属性和 argc
属性示例。
Redis 客户端的固定大小输出缓冲区示例。
Redis 客户端的可变大小输出缓冲区示例。
第 15 章: 复制¶
SYNC
命令执行期间,
主从服务器的通信过程。
Redis 的命令传播过程示例。
如果这时,
客户端向主服务器发送命令 DEL k3
,
那么主服务器在执行完这个 DEL 命令之后,
主从服务器的数据库将出现不一致:
主服务器的数据库已经不再包含键 k3
,
但这个键却仍然包含在从服务器的数据库里面,
如图 15-4 所示。
在上面的例子中,
主服务器因为执行了命令 DEL k3
而导致主从服务器不一致,
所以主服务器将向从服务器发送相同的命令 DEL k3
:
当从服务器执行完这个命令之后,
主从服务器将再次回到一致状态 ——
现在主从服务器两者的数据库都不再包含键 k3
了,
如图 15-5 所示。
PSYNC
命令执行部分重同步时的过程。
Redis 的复制积压缓冲区的结构图。
Redis 使用复制积压缓冲区来为断线的从服务器发送缺失数据的过程。
PSYNC
命令判断是执行部分重同步还是完整重同步的流程。
Redis 服务器监测命令缺失,并补发缺失命令的过程。
如果这时主服务器执行了命令 SET key value
(协议格式的长度为 33
字节),
将自己的复制偏移量更新到了 233
,
并尝试向从服务器传播命令 SET key value
,
但这条命令却因为网络故障而在传播的途中丢失,
那么主从服务器之间的复制偏移量就会出现不一致:
主服务器的复制偏移量会被更新为 233
,
而从服务器的复制偏移量仍然为 200
,
如图 15-24 所示。
在这之后,
当从服务器向主服务器发送 REPLCONF ACK 命令的时候,
主服务器会察觉从服务器的复制偏移量依然为 200
,
而自己的复制偏移量为 233
,
这说明复制积压缓冲区里面复制偏移量为 201
至 233
的数据(也即是命令 SET key value
)在传播过程中丢失了,
于是主服务器会再次向从服务器传播命令 SET key value
,
从服务器通过接收并执行这个命令可以将自己更新至主服务器当前所处的状态,
如图 15-25 所示。
第 16 章: Sentinel¶
Sentinel 状态以及已连接的两个 Sentinel 实例结构。
Sentinel 通过向主服务器发送 INFO
命令来获得从服务器的信息。
以及 Sentinel 为这个主服务器以及三个从服务器创建的信息结构。
Sentinel 通过命令连接向频道发送信息, 并通过订阅连接从频道中获取信息。
示例:一个 Sentinel 向包括它自己在内的三个 Sentinel 发送信息。
Redis Sentinel 执行故障转移的整个过程。
第 17 章: 集群¶
槽指派¶
图 17-9 展示了一个 slots
数组示例:
这个数组索引 0
至索引 7
上的二进制位的值都为 1
,
其余所有二进制位的值都为 0
,
这表示节点负责处理槽 0
至槽 7
。
图 17-10 展示了另一个 slots
数组示例:
这个数组索引 1
、 3
、 5
、 8
、 9
、 10
上的二进制位的值都为 1
,
而其余所有二进制位的值都为 0
,
这表示节点负责处理槽 1
、 3
、 5
、 8
、 9
、 10
。
节点之间互相传递槽指派信息的过程。
clusterState
结构的 slots
数组示例。
ASK 错误¶
源节点判断是否需要向客户端发送 ASK
错误的整个过程。
importing_slots_from
结构以及 migrating_slots_to
结构的示例。
客户端根据 ASK
错误进行转向的过程。
节点判断是否执行客户端命令的过程。
消息¶
集群中的节点通过发送消息来将一个节点标记为下线的过程。
接收到 PUBLISH
命令的节点向集群中的其他节点发送 PUBLISH
消息。
PUBLISH
消息中包含的 clusterMsgDataPublish
结构示例。
第 18 章: 发布与订阅¶
客户端订阅频道。
客户端向频道发送消息, 消息被传递至各个订阅者。
客户端订阅模式。
客户端向频道发送消息, 消息被传递给正在订阅匹配模式的订阅者。
另一个模式被匹配的例子。
pubsub_channels
字典示例。
pubsubPattern
结构示例。
pubsub_patterns
链表的示例。
第 20 章: Lua 脚本¶
Lua 环境协作组件¶
Lua 脚本执行 Redis 命令时的通讯步骤。
作为例子, 图 20-3 展示了 Lua 脚本在执行以下命令时:
redis> EVAL "return redis.call('DBSIZE')" 0
(integer) 10086
Lua 环境、伪客户端、命令执行器三者之间的通讯过程。
lua_scripts
字典示例。