Redis 数据持久化之 RDB

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/codejas/article/details/84036357

我们知道 Redis 是内存数据库,它将自己的数据存储在内存中,如果它不想办法将数据存入磁盘中,那么当服务器进程退出或意外宕掉的时候,服务器中的数据也会消失。

为了解决这个问题, Redis 提供了 RDB 与 AOF 两种数据持久化方式,将数据存储到磁盘中,避免数据丢失。

AOF 持久化不在本篇文章讨论范围内,如果大家感兴趣可以关注后面的总结文章。

一、RDB 介绍

在这里插入图片描述

RDB(Redis DataBase)持久化既可以手动执行,也可以通过触发服务器配置信息自动执行,用来将某个时间点上的数据保存到磁盘上的一个 RDB(dump.rdb) 文件中。

因为 dump.rdb 文件是保存在磁盘上的,即使 Redis 服务器进程退出或者意外宕掉,也可以通过该文件进行数据还原。

有两个命令可以用于生成 RDB 文件,一个是 SAVE 一个是 BGSAVE,但是这两个命令不可以同时被服务器处理。这两个命令的不同点主要是:

  • SAVE 命令会阻塞服务器进程,直到 RDB 文件创建完毕为止,在服务器进行阻塞期间,服务器不能处理任何命令请求。
  • BGSAVE 命令会派生出一个子进程,然后由子进程负责创建 RDB 文件,在这种情况下,服务器进程可以继续处理后续的命令请求。

想要生成 RDB 文件需要一定的条件,但是载入 RDB 文件只需要启动服务器即可,只要 Redis 服务器在启动时监测到 RDB 文件的存在,就会自动载入 RDB 文件。当服务器载入 RDB 文件期间,会一直处于阻塞状态,直到载入工作完成为止

PS:
因为 AOF 文件的更新频率高于 RDB 文件,所以当两种持久化模式都开启时,服务器会优先使用 AOF 文件来还原数据库。

二、自动间隔性同步数据

因为 BGSAVE 命令可以在不阻塞服务器进程的情况下执行,所以 Redis 允许用户通过自定义服务器配置信息,让服务器每隔一段时间就自动执行一次 BGSAVE 命令。

用户可以使用 save time count 设置多个条件,只要其中一个条件被满足,服务器就会自动执行 BGSAVE 命令,具体的触发条件可以在 redis.conf 中进行配置。

默认的配置信息如下:

save 900 1    # 在 900s 之内至少对数据库进行了 1 次修改
save 300 10   # 在 3000s 之内对数据库至少进行了 1 次修改
save 60 10000 # 在 60s 之内至少对数据库进行了 10000 次修改

Redis 底层会使用 saveParam 结构保存时间与修改次数:

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

最终会使用一个 saveparam 数组来保存相关的配置信息,下面是一个具体的图

在这里插入图片描述

redisServer 对象除了维护着一个 saveparam 数组外,还维护着一个 dirty 计数器与 lastsave 属性。

  • 每当服务器修改命令之后,程序就会自动对 dirty 属性执行更新,执行了多少次修改,dirty 就对应增加多少。
  • lastsave 属性记录了服务器上次执行保存(SAVEBGSAVE)操作的时间。

在服务器执行周期函数时(serverCron(),默认 100ms 执行一次),会根据 saveparamdirtylastsave 属性,自动判断出执行保存的时机。

三、RDB 持久化过程演示

下面简单的还原一下 RDB 文件数据恢复的过程,推荐大家自己尝试一下。

1.修改 redis.conf 配置文件中的 save 属性,设置在 10s 内修改了数据库就执行 BGSAVE 命令(保证在短时间内获得 RDB 文件)。

save 10 1    # 在 10s 之内至少对数据库进行了 1 次修改
save 300 10   
save 60 10000 

2.为了保证测试的正确性,可以在 Redis 客户端执行一次 FLUSHDB 命令,清空当前数据库中的所有数据,退出客户端并删除 dump.rdb 文件(其实执行 FLUSHDB 命令后 dump.rdb 中已经没有有效数据了)。

3.连接 Redis 客户端,添加一条数据,大约 10s 钟左右退出 Redis 客户端。

127.0.0.1:6379> KEYS *
(empty list or set)
127.0.0.1:6379> SET key1 value1
OK

4.查看当前文件下的所有文件,发现多了一个 dump.rdb 文件,然后使用 mv 命令修改 dump.rdb 文件名为 dump1.rdb。再次连接 Redis 客户端,执行一次 FLUSHDB 命令,确保当前数据库中没有任何数据。

5.由于 FLUSHDB 命令也会产生 dump.rdb 文件,因此要删除该 dump.rdb 文件,修改 dump1.rdb 文件名为dump.rdb,用来还原数据,接着关闭 Redis 服务。

6.重启 Redis 服务,因为 Redis 服务在启动时会加载 dump.rdb 文件,因此在使用客户端连接到数据库时,dump.rdb 文件中的数据会被还原。

127.0.0.1:6379> keys *
1) "key1"

四、参考资料

《Redis 设计与实现》 黄建宏 著

猜你喜欢

转载自blog.csdn.net/codejas/article/details/84036357