Redis 的 RDB(Redis Database)持久化机制是一种将数据以二进制文件的形式保存到磁盘的方法,确保即使在服务器崩溃或者重启后仍能恢复数据。以下是 RDB 持久化机制在 Redis 源码层面的一些关键解析点:
-
触发机制:
- Redis 提供了
save
和bgrewriteaof
命令可以手动触发 RDB 快照生成。 - 配置文件中可以通过
save
参数设置自动触发 RDB 的条件,例如当满足一定时间内有指定数量的 key 修改时自动执行 save 操作。
- Redis 提供了
-
Fork 子进程执行持久化:
- Redis 使用 fork() 系统调用创建一个子进程来执行实际的持久化工作,这样父进程可以继续处理客户端请求,而不影响正常服务。
- 子进程创建后,会拥有父进程数据的副本,然后开始将内存中的数据序列化成 RDB 文件。
-
数据序列化:
- RDB 文件是一个紧凑且高效的二进制格式,内部包含一系列 Redis 对象编码的序列化形式,包括但不限于字符串、列表、集合、哈希表、有序集合等。
- 序列化过程中,Redis 会对数据进行压缩以减小文件体积。
-
持久化流程:
- 子进程首先执行
rdbSave()
函数,开始遍历数据库中的所有键值对,并调用对应的rdbSaveObject()
函数将每个对象写入 RDB 文件。 - 在写入过程中,可能会涉及到内存页共享、I/O 缓冲区管理和错误处理。
- 子进程首先执行
-
文件操作:
- RDB 文件的名字和保存路径由配置文件中的
dbfilename
和dir
参数决定,默认文件名为dump.rdb
。 - 在创建新 RDB 文件前,Redis 可能会先尝试删除旧的 RDB 文件,防止因磁盘空间不足导致持久化失败。
- RDB 文件的名字和保存路径由配置文件中的
-
故障恢复:
- 当 Redis 服务器启动时,它会检查是否存在有效的 RDB 文件,如果存在则通过
rdbLoad()
函数将其内容反序列化到内存中,完成数据恢复。
- 当 Redis 服务器启动时,它会检查是否存在有效的 RDB 文件,如果存在则通过
-
后台异步执行:
- RDB 的生成过程通常是异步的,在后台执行,以减少对主线程的影响。
- 若后台保存出错,可以通过配置
stop-writes-on-bgsave-error
控制是否阻止新的写入操作。
-
主从复制:
- RDB 文件也被用于主从节点间的全量同步,主节点会在 slave 连接时发送 RDB 文件给从节点,从节点加载此文件以达到数据同步的目的。
通过源码分析,可以更深入理解 Redis 如何高效安全地执行 RDB 持久化,以及如何处理可能遇到的各种复杂情况,如内存拷贝、并发控制、异常处理等。随着 Redis 版本的更新迭代,RDB 持久化的具体实现细节可能会有所变化,但上述的核心机制依然有效。