RDB持久化 - 《Redis设计与实现》读书笔记
RDB持久化功能:将Redis在内存中某一个时间点
的数据库状态经过压缩保存到磁盘上的一个RDB二进制文件里面,避免数据意外丢失,
通过RDB二进制文件可以还原生成RDB二进制文件那个时间点的数据库状态,
RDB文件的创建: 内存 => 磁盘
-
save命令: 阻塞Redis服务器进程,直到RDB文件创建完毕为止
执行期间,服务器进程不能处理
客户端命令请求 -
bgsave命令: 派生出一个子进程,由子进程负责创建RDB文件,
执行期间,服务器进程(父进程)仍然可以处理
客户端命令请求,
出于进程竞争和性能问题,save、bgsave、bgrewriteaof命令不能同时执行
RDB文件的载入: 磁盘 => 内存
RDB文件的载入工作是在服务器启动时自动执行的,
执行路径:src/server.c/main => src/server.c/loadDataFromDisk
如果服务器开启
了AOF持久化功能,那么服务器会优先使用AOF文件
来还原数据库状态,
如果服务器关闭
了AOF持久化功能,那么服务器才会使用RDB文件
来还原数据库状态
自动间隔性保存
通过设置服务器配置的save选项,可以让服务器每隔一段时间
自动执行一次bgsave命令,
save选项可以设置多个
保存条件,但只要任意
一个条件被满足,就会执行bgsave命令,
// 触发保存rdb文件
for (j = 0; j < server.saveparamslen; j++) {
struct saveparam *sp = server.saveparams+j;
/* Save if we reached the given amount of changes,
* the given amount of seconds, and if the latest bgsave was
* successful or if, in case of an error, at least
* CONFIG_BGSAVE_RETRY_DELAY seconds already elapsed. */
if (
// 是否达到了给定的更改量
server.dirty >= sp->changes &&
// 是否达到了给定的秒数
server.unixtime-server.lastsave > sp->seconds &&
// 上次尝试bgsave的Unix时间是否已经过大于5秒 or 上次尝试bgsave是否成功
(server.unixtime-server.lastbgsave_try > CONFIG_BGSAVE_RETRY_DELAY || server.lastbgsave_status == C_OK))
{
serverLog(LL_NOTICE,"%d changes in %d seconds. Saving...",
sp->changes, (int)sp->seconds);
rdbSaveInfo rsi, *rsiptr;
rsiptr = rdbPopulateSaveInfo(&rsi);
// 执行rdb文件保存操作
rdbSaveBackground(server.rdb_filename,rsiptr);
break;
}
}
分析RDB文件
- 人工分析
使用-cx参数调用od命令,同时以ASCII编码和十六进制格式打印RDB文件
od -cx check-dump.rdb
-
使用Redis带有的RDB文件检查工具redis-check-dump
-
使用其它处理RDB文件的工具
源码阅读
- RDB文件的创建: src/rdb.c/rdbSave
- RDB文件载入: src/rdb.c/rdbLoad
只言片语任我说,提笔句句无需忖。落笔不知寄何人,唯有邀友共斟酌。