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;
}
10.2 自动间隔性保存
如果向服务器提供以下配置:
save 900 1
save 300 10
save 60  10000
那么只要满足任意一个,BGSAVE命令就会被执行:
服务器在900秒之内,对数据库进行了至少1次修改。
服务器在300秒之内,对数据库进行了至少10次修改。
服务器在60秒之内,对数据库进行了至少10000次修改。
serverCron默认每隔100毫秒就会执行一次,其中一项工作就是检查save选项所设置的
保存条件是否已经满足。
服务器状态中的保存条件
RDB文件数据库结构:
          
key_value_pairs结构:
10.5 重点回顾
Ⅰ RDB文件用于保存和还原Redis服务器所有数据库中的所有键值对数据。
Ⅱ SAVE命令由服务器进程直接执行保存操作,所有该命令会阻塞服务器。
Ⅲ BGSAVE命令由紫禁城执行保存操作,所以该命令不会阻塞服务器。
Ⅳ 服务器状态中会保存所有用save选项设置的保存条件,当任意一个保存条件被满足时,服务器会自动执BGSAVE命令。
Ⅴ RDB文件是一个经过压缩的二进制文件,由多个部分组成。
Ⅵ 对于不同类型的键值对,RDB文件会使用不同的方式来保存他们。
原文:http://blog.csdn.net/f1024042400/article/details/50979810