Redis系列(三):Redis的持久化机制(RDB、AOF)

本篇博客是Redis系列的第3篇,主要讲解下Redis的2种持久化机制:RDB和AOF。

本系列的前2篇可以点击以下链接查看:

Redis系列(一):Redis简介及环境安装。

Redis系列(二):Redis的5种数据结构及其常用命令

1. 为什么需要持久化?

因为Redis是内存数据库,它将自己的数据存储在内存里面,一旦Redis服务器进程退出或者运行Redis服务器的计算机停机,Redis服务器中的数据就会丢失。

为了避免数据丢失,所以Redis提供了持久化机制,将存储在内存中的数据保存到磁盘中,用于在Redis服务器进程退出或者运行Redis服务器的计算机停机导致数据丢失时,快速的恢复之前Redis存储在内存中的数据。

Redis提供了2种持久化方式,分别为:

RDB持久化

AOF持久化

接下来,我们一一详解。

2. RDB持久化

RDB持久化是将某个时间点上Redis中的数据保存到一个RDB文件中,如下所示:

Redis系列(三):Redis的持久化机制(RDB、AOF)

基于RDB持久化的上述性质,所以RDB持久化也叫做快照持久化。

该文件是一个经过压缩的二进制文件,通过该文件可以还原生成RDB文件时Redis中的数据,如下所示:

Redis系列(三):Redis的持久化机制(RDB、AOF)

2.1 创建RDB文件

Redis提供了2个命令来创建RDB文件,一个是SAVE,另一个是BGSAVE。

SAVE命令会阻塞Redis服务器进程,直到RDB文件创建完毕为止,在服务器进程阻塞期间,服务器不能处理任何命令请求,如下所示:

Redis系列(三):Redis的持久化机制(RDB、AOF)

BGSAVE命令会派生出一个子进程,然后由子进程负责创建RDB文件,服务器进程(父进程)继续处理命令请求,如下所示:

以上描述也是这2个命令的区别,这里是重点,面试经常会问到

因为BGSAVE命令可以在不阻塞服务器进程的情况下执行,所以推荐使用BGSAVE命令。

我们可以手动执行该命令,如上面截图所示,但还是推荐设置下Redis服务器配置文件的save选项,让服务器每隔一段时间自动执行一次BGSAVE命令。

我们可以通过save选项设置多个保存条件,只要其中任意一个条件被满足,服务器就会执行BGSAVE命令。

save选项设置的默认条件如下所示:

save 900 1

save 300 10

save 60 10000

Redis系列(三):Redis的持久化机制(RDB、AOF)

默认的配置条件表示,只要满足以下3个条件中的任意1个,BGSAVE命令就会被执行:

服务器在900s(即15分钟)之内,对数据库进行了至少1次修改

服务器在300s(即5分钟)之内,对数据库进行了至少10次修改

服务器在60s(即1分钟)之内,对数据库进行了至少10000次修改

当满足条件执行BGSAVE命令时,输出日志如下图所示:

Redis系列(三):Redis的持久化机制(RDB、AOF)

生成的RDB文件会根据Redis配置文件中的名称和路径来保存,相关的2个配置如下所示:

Redis系列(三):Redis的持久化机制(RDB、AOF)

最终生成的RDB文件如下所示(截图为本机Windows环境,Linux环境下路径会稍有不同):

Redis系列(三):Redis的持久化机制(RDB、AOF)

2.2 载入RDB文件

首先,我们要明确的是,载入RDB文件的目的是为了在Redis服务器进程重新启动之后还原之前存储在Redis中的数据。

然后,Redis载入RDB文件并没有专门的命令,而是在Redis服务器启动时自动执行的。

而且,Redis服务器启动时是否会载入RDB文件还取决于服务器是否启用了AOF持久化功能,具体判断逻辑为:

只有在AOF持久化功能处于关闭状态时,服务器才会使用RDB文件来还原数据。

如果服务器开启了AOF持久化功能,那么服务器会优先使用AOF文件来还原数据。

以上判断逻辑如下图所示:

Redis系列(三):Redis的持久化机制(RDB、AOF)

默认情况下,Redis服务器的AOF持久化功能是关闭的,所以Redis服务器在启动时会载入RDB文件,

启动日志如下所示:

Redis系列(三):Redis的持久化机制(RDB、AOF)

2.3 服务器状态

创建和载入RDB文件,可能存在的服务器状态有以下3种:

当执行SAVE命令时,Redis服务器会被阻塞,此时客户端发送的所有命令请求都会被阻塞,只有在服务器执行完SAVE命令,重新开始接受命令请求之后,客户端发送的命令请求才会被处理。

当执行BGSAVE命令时,Redis服务器不会被阻塞,Redis服务器仍然可以继续处理客户端发送的命令请求。

服务器在载入RDB文件期间,会一直处于阻塞状态,直到RDB文件载入成功。

3. AOF持久化

AOF持久化是通过保存Redis服务器所执行的写命令来记录数据库数据的,如下图所示:

Redis系列(三):Redis的持久化机制(RDB、AOF)

默认情况下,AOF持久化功能是关闭的,如果想要打开,可以修改下图所示的配置:

Redis系列(三):Redis的持久化机制(RDB、AOF)

举个例子,假设Redis中还没有存储任何数据,我们执行了如下所示的命令:

Redis系列(三):Redis的持久化机制(RDB、AOF)

然后我们会发现Redis服务器生成了1个名为appendonly.aof的文件,打开该文件,我们可以看到上面执行的3个写命令都存储在该文件中:

Redis系列(三):Redis的持久化机制(RDB、AOF)

Redis系列(三):Redis的持久化机制(RDB、AOF)

3.1 AOF持久化的实现

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpxyfg.html