一.引出Redis持久化
Redis是一个内存数据库,它将自己的数据库状态存在内存中,如果Redis服务器进程退出,那么服务器中的数据库状态也会消失不见,所以应想办法将存储在内存中的数据库状态保存到磁盘中。因此,Redis提供了RDB持久化功能和AOF持久化功能。
二.RDB持久化
RDB持久化是Redis提供的一个可以将Redis在内存中的数据库状态保存到磁盘中的功能。
RDB持久化既可以手动执行,也可以根据服务器配置选项定期执行。
RDB持久化功能是将某个时间点上的数据库状态保存到一个RDB文件中,该RDB文件是一个经过压缩的二进制文件,该文件可以还原生成RDB文件时的数据库状态。
由于RDB文件是保存在硬盘中的,所以即使Redis服务器进程退出,甚至运行Redis服务器的计算机停机,但只要RDB文件存在,Redis服务器就可以用它来还原数据库状态。
1.RDB文件的创建
Redis提供了两个命令用于生产RDB文件:SAVE和BGSAVE
SAVE命令会阻塞Redis服务器进程,直到RDB文件创建完毕为止,在服务器进程阻塞期间,服务器不能处理任何命令请求:
redis>SAVE //等待直到RDB文件创建完毕
ok
BGSAVE命令则是派生一个子进程,然后由子进程负责创建RDB文件,服务器进程继续处理命令请求:
redis>BGSAVE //派生子进程,并有子进程创建RDB文件
Background saving started
在BGSAVE命令执行期间,客户端发送的BGSAVE命令会被服务器拒绝,因为同时执行两个BGSAVE命令会产生竞争条件。
2.RDB文件的载入
与创建RDB文件不同,RDB文件的载入工作是在服务器启动时自动执行的,所以Redis并没有专门用于载入RDB文件的命令,只要Redis服务器在启动时检测到RDB文件存在,它就会自动载入RDB文件。
服务器在载入RDB文件期间,会一直处于阻塞状态,直到载入工作完成为止。
三.AOF持久化
RDB持久化是保存数据库中的键值对来记录数据库状态的不同,而AOF持久化是通过保存Redis服务器所执行的命令来记录数据库状态的。
被写入AOF文件的所有命令都是以Redis的命令请求协议格式保存的。
1.AOF持久化的实现
AOF功能的实现可以分为命令追加、文件写入、文件同步三个步骤。
(1)命令追加
当AOF持久化功能处于打开状态时,服务器在执行完一个写命令后,会以协议格式将被执行的写命令追加到服务器的aof_buf缓冲区的末尾。
(2)AOF文件的写入与同步
Redis的服务器进程就是一个事件循环,这个循环中的文件事件负责接收客户端的命令请求,以及向客户端发送命令回复。
因为服务器在处理文件事件时可能会执行写命令,使得一些内容被追加到aof_buf缓冲区里面,所以在服务器每次结束一个事件循环之前,它都会调用flushAppendOnlyFile函数,考虑是否需要将aof_buf缓冲区中的内容写入和保存到AOF文件里面。
2.AOF文件的载入与数据还原
Redis读取AOF文件并还原数据库状态的详细步骤如下:
(1)创建一个不带网络连接的伪客户端
(2)从AOF文件中分析并读取出一条写命令
(3)使用伪客户端执行被读出的写命令
(4)一直执行步骤2和步骤3,直到AOF文件中所有写命令都被处理完毕为止
3.AOF重写
由于AOF持久化是通过保存被执行的写命令来记录数据库状态的,所以随着服务器运行时间的流逝,AOF文件中的内容会越来越多,文件的体积也会越来越大,如果不加以控制,体积过大的AOF文件很可能对Redis服务器甚至整个宿主计算机造成影响,并且AOF文件的体积越大,使用AOF文件来进行数据还原所需的时间越多。
为了解决AOF文件体积膨胀的问题,Redis提供了AOF重写功能,通过该功能,Redis服务器创建一个新的AOF文件来替代现有的AOF文件,新旧两个AOF文件所保存的数据库状态相同,但新的AOF文件不会包含任何浪费空间的冗余命令,所以新的AOF文件的体积通常会比旧的AOF文件的体积小得多。
另外,因为AOF文件的更新频率通常比RDB文件的更新频率高,所以:
如果服务器开启了AOF持久化功能,那么服务器会优先使用AOF文件还原数据库状态;
只有在AOF持久化功能处于关闭状态时,服务器才会使用RDB文件来还原数据库状态。
1567

被折叠的 条评论
为什么被折叠?



