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文件会使用不同的方式来保存他们。

时间: 2024-10-24 22:28:47

Redis 学习 ---- 10.RDB持久化的相关文章

Redis实现之RDB持久化(一)

RDB持久化 Redis是一个键值对数据库服务器,服务器中通常包含着任意个非空数据库,而每个非空数据库中又可以包含任意个键值对,为了方便起见,我们将服务器中的非空数据库以及它们的键值对统称为数据库状态.举个栗子,图1-1展示了一个包含三个非空数据库的Redis服务器,这三个数据库以及数据库中的键值对就是该服务器的数据库状态 图1-1   数据库状态示例 因为Redis是内存数据库,它将自己的数据库状态存储在内存里面,所以如果不想办法将存储在内存中的数据库状态保存到磁盘中,那么一旦服务器进程退出,

redis中的RDB持久化详解

1. 如何在redis中配置RDB持久化文件 在redis持久化中  默认是开启RDB模式的.这里我们只需要对RDB进行配置即可 在上面有三个配置选项 分别是 每隔900秒  有一条key进行变更 每个300秒 有10条key进行变更 没隔60秒  有10000条key进行变更. 以上任意条达成条件后,就会重新生成一个dump.rdb文件.就是当前redis内存中完整的快照,这个操作也被称之为snapshotting,快照也可以手动调用save或者bgsave命令,同步或异步执行rdb快照生成

redis 源码学习(RDB 持久化)

redis是个内存数据库,所有的操作都是在内存中进行,但是内存有个特点是,程序出问题或者系统出问题.重启,关机都会造成内存数据丢失. 所以需要把内存中的数据dump到硬盘中备份起来. RDB持久化,是内存数据库dump到硬盘的过程,其中RDB是个文件格式,待会介绍. 本文从两个方向剖析, 1)加载dump.rdb文件到内存中. 2)内存数据库dump到硬盘中dump.rdb文件. 加载dump.rdb文件到内存 main函数入口: int main(int argc, char **argv)

redis学习笔记——RDB和AOF持久化

为防止数据丢失,需要将 Redis 中的数据从内存中 dump 到磁盘,这就是持久化.Redis 提供两种持久化方式:RDB 和 AOF.Redis 允许两者结合,也允许两者同时关闭. RDB 可以定时备份内存中的数据集.服务器启动的时候,可以从 RDB 文件中恢复数据集. AOF(append only file) 可以记录服务器的所有写操作.在服务器重新启动的时候,会把所有的写操作重新执行一遍,从而实现数据备份.当写操作集过大(比原有的数据集还大),Redis 会重写写操作集. 值得一提的是

Redis学习手册(持久化)

一.Redis提供了哪些持久化机制: 1). RDB持久化:该机制是指在指定的时间间隔内将内存中的数据集快照写入磁盘.2). AOF持久化:该机制将以日志的形式记录服务器所处理的每一个写操作,在Redis服务器启动之初会读取该文件来重新构建数据库,以保证启动后数据库中的数据是完整的.3). 无持久化:我们可以通过配置的方式禁用Redis服务器的持久化功能,这样我们就可以将Redis视为一个功能加强版的memcached了.4). 同时应用AOF和RDB. 二.RDB机制的优势和劣势: RDB存在

Redis学习笔记5--Redis持久化

Redis是一个支持持久化的内存数据库,也就是说redis需要经常将内存中的数据同步到磁盘来保证持久化.redis支持四种持久化方式,一是 Snapshotting(快照)也是默认方式:二是Append-only file(缩写aof)的方式:三是虚拟内存方式:四是diskstore方式.下面分别介绍之. (一)Snapshotting 快照是默认的持久化方式.这种方式是就是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb.可以通过配置设置自动做快照持久化的方式.我们可

Redis学习笔记9--Redis持久化

redis是一个支持持久化的内存数据库,也就是说redis需要经常将内存中的数据同步到磁盘来保证持久化.redis支持四种持久化方式,一是 Snapshotting(快照)也是默认方式:二是Append-only file(缩写aof)的方式:三是虚拟内存方式:四是diskstore方式.下面分别介绍之. (一)Snapshotting 快照是默认的持久化方式.这种方式是就是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb.可以通过配置设置自动做快照持久化的方式.我们可

redis学习笔记——RDB和AOF持久化二

上一篇对RDB的源码分析是比较多的,但是AOF持久化执行进行了一些理论上的分析和概念的说明.本来想自己偷一些懒,将上篇文章中最后所给链接的AOF实现代码随便过一过算了,后来也就是在过的过程中发现自己这也看不懂那也看不懂才知道AOF的重要性和难度. 后来又花了不少时间查阅资料.结合源代码分析,对AOF的大概执行过程有了更深一些的了解,现在就将自己的理解和大家进行分享.其中肯定有理解不正确的地方,还望大神们能给予指正. AOF相关配置项 首先我们看一下redis.conf里的关于AOF的配置选项:A

redis学习笔记——RDB、AOF和复制时对过期键的处理

AOF.RDB和复制功能对过期键的处理 生成RDB文件 在执行SAVE命令或者BGSAVE命令创建一个新的RDB文件时,程序会对数据库中的键进行检查,已过期的键不会被保存到新创建的RDB文件中.举个例子,如果数据库中包含三个键k1.k2.k3,并且k2已经过期,那么当执行SAVE命令或者BGSAVE命令时,程序只会将k1和k3的数据保存到RDB文件中,而k2则会被忽略.因此,数据库中包含过期键不会对生成新的RDB文件造成影响. 可参考rdb.c中函数rdbSave()函数源码: /* Itera