Redis的持久化

 一.引出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文件来还原数据库状态。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值