RDB持久化

RDB持久化功能:将Redis在内存中某一个时间点的数据库状态经过压缩保存到磁盘上的一个RDB二进制文件里面,避免数据意外丢失,
通过RDB二进制文件可以还原生成RDB二进制文件那个时间点的数据库状态,

RDB文件的创建: 内存 => 磁盘

  1. save命令: 阻塞Redis服务器进程,直到RDB文件创建完毕为止
    执行期间,服务器进程不能处理客户端命令请求

  2. 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文件

  1. 人工分析
    使用-cx参数调用od命令,同时以ASCII编码和十六进制格式打印RDB文件
    od -cx check-dump.rdb
  1. 使用Redis带有的RDB文件检查工具redis-check-dump

  2. 使用其它处理RDB文件的工具

源码阅读

  1. RDB文件的创建: src/rdb.c/rdbSave
  2. RDB文件载入: src/rdb.c/rdbLoad
只言片语任我说,提笔句句无需忖。落笔不知寄何人,唯有邀友共斟酌。
原文地址:https://www.cnblogs.com/phonecom/p/15129380.html