本篇博客是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文件中,如下所示:
基于RDB持久化的上述性质,所以RDB持久化也叫做快照持久化。
该文件是一个经过压缩的二进制文件,通过该文件可以还原生成RDB文件时Redis中的数据,如下所示:
2.1 创建RDB文件Redis提供了2个命令来创建RDB文件,一个是SAVE,另一个是BGSAVE。
SAVE命令会阻塞Redis服务器进程,直到RDB文件创建完毕为止,在服务器进程阻塞期间,服务器不能处理任何命令请求,如下所示:
BGSAVE命令会派生出一个子进程,然后由子进程负责创建RDB文件,服务器进程(父进程)继续处理命令请求,如下所示:
以上描述也是这2个命令的区别,这里是重点,面试经常会问到。
因为BGSAVE命令可以在不阻塞服务器进程的情况下执行,所以推荐使用BGSAVE命令。
我们可以手动执行该命令,如上面截图所示,但还是推荐设置下Redis服务器配置文件的save选项,让服务器每隔一段时间自动执行一次BGSAVE命令。
我们可以通过save选项设置多个保存条件,只要其中任意一个条件被满足,服务器就会执行BGSAVE命令。
save选项设置的默认条件如下所示:
save 900 1
save 300 10
save 60 10000
默认的配置条件表示,只要满足以下3个条件中的任意1个,BGSAVE命令就会被执行:
服务器在900s(即15分钟)之内,对数据库进行了至少1次修改
服务器在300s(即5分钟)之内,对数据库进行了至少10次修改
服务器在60s(即1分钟)之内,对数据库进行了至少10000次修改
当满足条件执行BGSAVE命令时,输出日志如下图所示:
生成的RDB文件会根据Redis配置文件中的名称和路径来保存,相关的2个配置如下所示:
最终生成的RDB文件如下所示(截图为本机Windows环境,Linux环境下路径会稍有不同):
2.2 载入RDB文件首先,我们要明确的是,载入RDB文件的目的是为了在Redis服务器进程重新启动之后还原之前存储在Redis中的数据。
然后,Redis载入RDB文件并没有专门的命令,而是在Redis服务器启动时自动执行的。
而且,Redis服务器启动时是否会载入RDB文件还取决于服务器是否启用了AOF持久化功能,具体判断逻辑为:
只有在AOF持久化功能处于关闭状态时,服务器才会使用RDB文件来还原数据。
如果服务器开启了AOF持久化功能,那么服务器会优先使用AOF文件来还原数据。
以上判断逻辑如下图所示:
默认情况下,Redis服务器的AOF持久化功能是关闭的,所以Redis服务器在启动时会载入RDB文件,
启动日志如下所示:
2.3 服务器状态创建和载入RDB文件,可能存在的服务器状态有以下3种:
当执行SAVE命令时,Redis服务器会被阻塞,此时客户端发送的所有命令请求都会被阻塞,只有在服务器执行完SAVE命令,重新开始接受命令请求之后,客户端发送的命令请求才会被处理。
当执行BGSAVE命令时,Redis服务器不会被阻塞,Redis服务器仍然可以继续处理客户端发送的命令请求。
服务器在载入RDB文件期间,会一直处于阻塞状态,直到RDB文件载入成功。
3. AOF持久化AOF持久化是通过保存Redis服务器所执行的写命令来记录数据库数据的,如下图所示:
默认情况下,AOF持久化功能是关闭的,如果想要打开,可以修改下图所示的配置:
举个例子,假设Redis中还没有存储任何数据,我们执行了如下所示的命令:
然后我们会发现Redis服务器生成了1个名为appendonly.aof的文件,打开该文件,我们可以看到上面执行的3个写命令都存储在该文件中:
3.1 AOF持久化的实现