`

RDB 持久化

阅读更多
        RDB 持久化功能可以将 Redis 在某个时刻内存中的数据库状态保存到 RDB 磁盘文件里面,以免数据丢失。RDB 文件是一个经过压缩的二进制文件,通过该文件亦可还原生成 RDB 文件时的数据库状态。
        RDB 持久化可以手动执行,也可根据服务器配置选项定期执行。
        SAVE 和 BGSAVE 命令可以用于生成 RDB 文件。SAVE 命令会阻塞 Redis 服务器进程,直到 RDB 文件创建完毕,在阻塞期间,服务器会拒绝客户端的任何命令请求。而 BGSAVE 命令则会单独派生一个子进程来负责创建 RDB 文件,因此服务器进程可以继续处理命令请求。创建 RDB 文件的工作实际上是由底层的 rdbSave 函数来完成的,SAVE 和 BGSAVE 命令只是以不同的方式调用这个函数而已,这可以通过以下的伪代码表示。
def SAVE():
    rdbSave()                # 创建 RDB 文件

def BGSAVE():
    pid = fork()             # 创建子进程
    if pid == 0:
        rdbSave()            # 子进程负责创建 RDB 文件
        signal_parent()      # 完成后向父进程发送信号
    elif pid > 0:
        # 父进程继续处理命令请求,并通过轮询等待子进程的信号
        handle_request_and_wait_signal()
    else:
        handle_fork_error()    # 处理出错情况

        虽然 Redis 在 BGSAVE 命令执行期间仍然可以继续处理客户端的命令请求,但是 SAVE、BGSAVE 和 BGREWRITEAOF 三个命令的处理方式却和平时有所不同。在 BGSAVE 命令执行期间,客户端发送的 SAVE 和 BGSAVE 命令都会被服务器拒绝,这主要是为了避免多个进程同时执行 rdbSave 函数,从而产生竞争条件。而 BGREWRITEAOF 命令在 BGSAVE 命令执行期间会被延迟,直到 BGSAVE 命令执行完毕后才会执行。反过来,如果 BGREWRITEAOF 命令正在执行,那么客户端发送的 BGSAVE 命令则会被服务器拒绝。尽管 BGSAVE 和 BGREWRITEAOF 命令的实际工作都由子进程执行,而且它们在操作方面也没有什么冲突的地方,但之所以不能同时执行它们,主要是出于性能方面的考虑,因为它们都涉及同时执行大量的磁盘写入操作。
        由于 RDB 文件的载入工作是在服务器启动时自动执行的,所以 Redis 没有专门用于载入 RDB 文件的命令,只要服务器启动时检测到 RDB 文件存在,它就会自动载入 RDB 文件。另外值得一提的是,因为 AOF 文件的更新频率通常高于 RDB 文件,因此如果服务器开启了 AOF 持久化功能,那么服务器会优先使用 AOF 文件来还原数据库状态。
        因为 BGSAVE 命令的执行不阻塞服务器,所以 Redis 允许用户通过配置 save 选项设置多个保存条件来让服务器每隔一段时间就自动执行一次 BGSAVE 命令,只要其中任意一个条件被满足,服务器就会执行 BGSAVE 命令。比如,服务器的默认 save 选项配置如下:
        save 900 1
        save 300 10
        save 60 10000
        这表示只要满足以下三个条件之一,BGSAVE 命令就会被执行:
        (1)服务器在 900 秒之内,对数据库进行了至少 1 次修改。
        (2)服务器在 300 秒之内,对数据库进行了至少 10 次修改。
        (3)服务器在 60 秒之内,对数据库进行了至少 10000 次修改。
        Redis 服务器启动时,用户可以通过指定配置文件或者传入启动参数的方式设置 save 选项,服务器程序会根据 save 选项设置的保存条件来设置服务器状态 redisServer 结构的 saveparams 属性,该属性是一个数组,其中的每个元素都是一个 saveparam 结构,每个结构保存一个 save 选项设置的保存条件。
struct redisServer{
    /* ... */
    struct saveparam *saveparams;
    long long dirty;    // 修改计数器
    time_t lastsave;    // 上一次执行保存的时间
    /* ... */
};

struct saveparam{
    time_t seconds;    // 秒数
    int changes;       // 修改数
};

        除了 saveparams 数组之外,服务器状态还维护着一个 dirty 计数器和一个 lastsave 属性。其中,dirty 计数器记录距离上一次成功执行 SAVE 或者 BGSAVE 命令后,服务器又对数据库状态(服务器中的所有数据库)进行了多少次修改(包括写入、删除和更新等操作)。而 lastsave 属性是一个 UNIX 时间戳,记录了服务器上一次成功执行 SAVE 或 BGSAVE 命令的时间。
        Redis 的服务器周期性操作函数 serveCron 默认每隔 100 毫秒就会执行一次,它用于对正在运行的服务器进行维护,它的其中一项工作就是检查 save 选项所设置的保存条件是否已经满足,只要有一个满足,它就会执行 BGSAVE 命令。这个过程的伪代码如下。
def serverCron():
    # ...
    for saveparam in server.saveparams:
        interval = unixtime_now() - server.lastsave;
        if server.dirty >= saveparam.changes and interval > saveparam.seconds:
            BGSAVE()
            break
    # ...

        以上就是 Redis 服务器根据 save 选项所设置的保存条件来自动执行 BGSAVE 命令,从而进行间隔性数据保存的实现原理。

参考书籍:《Redis 设计与实现》第 10 章——RDB 持久化。
分享到:
评论

相关推荐

    RDB持久化机制: - RDB默认开启 - RDB存储二进制数据

    - RDB持久化机制: - RDB默认开启 - RDB存储二进制数据,RDB在持久化和读取持久化文件时,速度较快 - RDB持久化的时机: save second keys # 在second时间内,执行了key次写操作,就执行RDB的持久化 - 优缺点...

    RDB 持久化.pdf

    RDB持久化是通过创建数据集的快照来实现的。Redis通过fork操作创建一个子进程,子进程将数据写入临时文件,完成快照后用临时文件替换旧的持久化文件。这种方式是Redis的一种快照持久化方式,它能够将某一时刻的内存...

    Redis RDB持久化.flv

    Redis RDB持久化.flv

    Redis 持久化之RDB和AOF.doc

    Redis 持久化是确保数据安全的重要机制,它提供了两种主要的方法:RDB(Redis Database)和 AOF(Append Only File)。RDB 是一种快照式的持久化方式,而 AOF 则记录每次写操作的日志。 RDB 持久化在特定条件下将...

    Redis持久化机制思维导图完整版

    RDB持久化RDB(Redis DataBase)持久化是一种基于快照的持久化方式。在指定的时间间隔内,如果满足一定条件(如某段时间内发生的写操作次数),Redis会生成一个包含当前内存数据的RDB文件。这个RDB文件可以用于数据...

    Redis的持久化方案

    RDB持久化方案是指在指定的时间间隔内,通过对当前数据集生成数据快照(即一个二进制文件)来保存数据状态。RDB是一种数据备份的模式,可以通过配置来设置快照的生成频率,比如每5分钟生成一次快照。RDB的优点包括...

    redis持久化方式

    为了保证数据的安全性和持久性,Redis 提供了两种主要的持久化机制:RDB 快照(Redis Database Backup)和 AOF(Append Only File)。本文将详细介绍这两种持久化方式的原理、配置方法及其各自的优缺点。 #### RDB ...

    Redis的持久化方案.pdf(两种持久化方案:RDB 和 AOF,共15页)

    2. **性能影响**: 在大数据集的情况下,执行RDB持久化操作需要调用fork()函数来创建子进程,这可能会导致Redis暂时无法响应客户端请求,特别是在CPU性能不足的情况下。 #### AOF 持久化方案 **概述** AOF方式记录...

    06_redis 持久化.pdf

    RDB持久化的过程关注的是数据快照,即在某个时间点将内存中的所有数据保存到磁盘上。RDB方式通过执行save命令或bgsave命令来创建快照。其中,save命令会阻塞Redis服务器,直到RDB过程完成,因此在生产环境中一般不...

    04_redis 数据持久化 和 lamp 环境搭建.docx

    - **数据安全性**:AOF持久化通常比RDB持久化更安全,因为它能够记录每一次写操作,即使在断电情况下也能够通过回放AOF文件来恢复数据。 - **恢复速度**:RDB持久化恢复数据的速度通常比AOF更快,因为只需要加载一次...

    REDIS persistence -- Redis中国用户组(CRUG)1

    Redis 是一个高性能的 NoSQL 数据库,为了确保数据的安全性和可靠性,Redis 提供了多种持久化机制,分别是 RDB 持久化方式和 AOF 持久化方式。本文将对 Redis 持久化机制进行详细的介绍和比较。 RDB 持久化方式 ...

    redis性能调优参考(15页).pdf

    * 自动触发RDB持久化:Redis内部还存在自动触发RDB持久化机制,例如使用save相关配置、从节点执行全量复制操作等。 本文档为开发者提供了Redis性能调优的相关知识点,涵盖数据库管理、慢查询日志、RDB持久化等方面...

    09.图解分析redis的RDB和AOF两种持久化机制的工作原理.zip

    **RDB持久化**: RDB是Redis的一种快照持久化方式。它会在某个时间点创建一个数据库的完整备份,即生成一个二进制文件,通常命名为`dump.rdb`。这个过程由Redis服务器后台异步执行,不会影响到正常服务。当Redis重启...

    Redis持久化锦囊在手,再也不会担心数据丢失了(csdn)————程序.pdf

    本文主要介绍了 Redis 的两种持久化机制:RDB(Redis Database Backup file)和 AOF(Append Only File),重点讲解了 RDB 的工作原理与实现。 RDB 是 Redis 数据库的一种快照备份,它将当前内存中的数据库状态保存...

    redis 的持久化方式1

    在RDB持久化过程中,Redis会将当前数据库状态以二进制的形式保存到一个文件中,通常命名为`dump.rdb`。这种持久化方式的主要特点和优缺点如下: **优点**: 1. **高性能**:RDB是通过fork子进程来执行的,主进程不...

    从源码解读redis持久化

    ### RDB持久化 RDB是通过创建数据的快照来实现持久化。Redis提供了`SAVE`和`BGSAVE`两个命令来触发快照生成: 1. **SAVE命令**:这个命令会阻塞Redis服务器,直到快照创建完成。这意味着在保存过程中,Redis无法...

    Redis windows 测试redis持久化功能1

    1. RDB 持久化:这是一种定期快照的方式,通过 `save` 配置项来定义触发保存的条件。例如: ``` save 900 1 save 300 10 save 60 10000 ``` 这表示在 900 秒(15 分钟)内只要有 1 个键发生变化,或者 300 秒...

    第四十六章:Redis数据库持久化1

    Redis 提供了两种主要的持久化方法:RDB(Redis Database Persistence,快照持久化)和 AOF(Append Only File,日志持久化)。 RDB 持久化通过定期生成数据集的快照来保存数据,这个过程由 Redis 的子进程执行,...

    第7单元 Redis事务与持久化1

    RDB持久化会定期生成数据库的一个快照(二进制文件),保存当前时刻Redis内存中的所有数据。这种快照可以在系统崩溃后用于恢复数据。RDB文件是经过压缩的,能快速加载,但可能会丢失最后一次持久化以来的数据。 **...

Global site tag (gtag.js) - Google Analytics