Redis 学习 ---- 10.RDB持久化

Posted black_and_blue

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis 学习 ---- 10.RDB持久化相关的知识,希望对你有一定的参考价值。

10.1 RDB文件的创建和载入
有俩个Redis命令可以用于生成RDB文件,一个是SAVE,另一个是BGSAVE。

SAVE命令会阻塞Redis服务器进程,直到RDB文件创建完毕为止。

BGSAVE命令会派生出一个子金城关负责创建RDB文件,服务器进程继续处理命令请求。


RDB文件的载入工作是在服务器启动时自动执行的,因为AOF文件的更新频率通常比RDB文件的更新频率高,所以:
① 如果服务器开启了AOF持久化功能,那么服务器会优先使用过AOF文件来还原数据库状态;
② 只有在AOF持久化功能处于关闭状态时,服务器才会使用RDB文件来还原数据库状态。


服务器判断该用哪个文件来还原数据库状态的流程如下图所示:

技术分享技术分享

技术分享


10.1.2 BGSAVE命令执行时的服务器状态

int rdbSave(char *filename) {//save命令执行函数
    char tmpfile[256];
    FILE *fp;
    rio rdb;
    int error;

    snprintf(tmpfile,256,"temp-%d.rdb", (int) getpid());
    fp = fopen(tmpfile,"w");
    if (!fp) {
        redisLog(REDIS_WARNING, "Failed opening .rdb for saving: %s",
            strerror(errno));
        return REDIS_ERR;
    }

    rioInitWithFile(&rdb,fp);
    if (rdbSaveRio(&rdb,&error) == REDIS_ERR) {
        errno = error;
        goto werr;
    }

    /* Make sure data will not remain on the OS's output buffers */
    if (fflush(fp) == EOF) goto werr;
    if (fsync(fileno(fp)) == -1) goto werr;
    if (fclose(fp) == EOF) goto werr;

    /* Use RENAME to make sure the DB file is changed atomically only
     * if the generate DB file is ok. */
    if (rename(tmpfile,filename) == -1) {
        redisLog(REDIS_WARNING,"Error moving temp DB file on the final destination: %s", strerror(errno));
        unlink(tmpfile);
        return REDIS_ERR;
    }
    redisLog(REDIS_NOTICE,"DB saved on disk");
    server.dirty = 0;
    server.lastsave = time(NULL);
    server.lastbgsave_status = REDIS_OK;
    return REDIS_OK;

werr:
    redisLog(REDIS_WARNING,"Write error saving DB on disk: %s", strerror(errno));
    fclose(fp);
    unlink(tmpfile);
    return REDIS_ERR;
}


在BGSAVE命令执行期间,SAVE、BGSAVE命令会被服务器拒绝,


BGSAVE和BGREWRITEAOF不能同时执行:
① 如果BGSAVE正在执行,那么BGREWRITEAOF命令会被延迟到BGSAVE命令执行完毕之后执行。
② 如果BGREWRITEAOF命令正在执行,那么客户端发送的BGSAVE命令会被服务器拒绝。


10.2 自动间隔性保存
如果向服务器提供以下配置:
save 900 1
save 300 10
save 60  10000
那么只要满足任意一个,BGSAVE命令就会被执行:
服务器在900秒之内,对数据库进行了至少1次修改。
服务器在300秒之内,对数据库进行了至少10次修改。
服务器在60秒之内,对数据库进行了至少10000次修改。


serverCron默认每隔100毫秒就会执行一次,其中一项工作就是检查save选项所设置的
保存条件是否已经满足。


服务器状态中的保存条件

技术分享技术分享


RDB文件结构:

技术分享

技术分享

RDB文件数据库结构:

技术分享

          技术分享

key_value_pairs结构:

技术分享

技术分享


10.5 重点回顾
Ⅰ RDB文件用于保存和还原Redis服务器所有数据库中的所有键值对数据。
Ⅱ SAVE命令由服务器进程直接执行保存操作,所有该命令会阻塞服务器。
Ⅲ BGSAVE命令由紫禁城执行保存操作,所以该命令不会阻塞服务器。
Ⅳ 服务器状态中会保存所有用save选项设置的保存条件,当任意一个保存条件被满足时,服务器会自动执BGSAVE命令。
Ⅴ RDB文件是一个经过压缩的二进制文件,由多个部分组成。
Ⅵ 对于不同类型的键值对,RDB文件会使用不同的方式来保存他们。























































以上是关于Redis 学习 ---- 10.RDB持久化的主要内容,如果未能解决你的问题,请参考以下文章

Redis

redis 一般有用 看1

Redis设计与实现-10.RDB和AOF归纳比较

Redis的持久化策略

Redis持久化方式

Redis,持久化方案