Redis持久化机制(AOF+RDB)

为什么要持久化?

Redis是内存数据库,数据保存在内存中。一旦服务器退出,
Redis中的数据就会消失。所以Redis提供了持久化技术将内存中的数据保存到磁盘。
Redis提供了两种持久化技术,RDB和AOF

RDB持久化方式:

通过创建快照的方式,将某个时间段内存中数据保存在RDB文件中,
RDB文件是一个压缩的二进制文件。

这里写图片描述
RDB文件是保存在磁盘上的,所以不管Redis服务器退出,只要磁盘上的RDB文件存在,Redis服务器就可以使用它来还原数据库的状态。

RDB文件的创建

使用SAVE和BGSAVE命令
SAVE:阻塞Redis服务器进程,直至RDB文件创建完毕
BGSAVE:会派生一个子进程,由子进程来创建RDB文件,父进程继续处理其它令

自动间隔性保存:

因为BGSAVE命令在创建快照的时候Redis服务器不会阻塞,
所以可以配置SAVE选项,让服务器每隔一段时间就执行一次BGSAVE命令。
可以通过配置SAVE选项来保存多个条件,只要一个满足,
服务器就会执行BGSAVE命令来创建快照。
在redis.conf文件中配置
save 900 1 服务器在900秒内对服务器进行了一次修改,就会创建RDB文件

RDB文件的载入

在Redis服务器启动的时候检测到有RDB文件的存在,就会自动载入RDB文件,
来还原数据库的状态。

这里写图片描述

如果只使用RDB创建快照来持久化保存数据时,如果系统真的发生崩溃,用户将丢失最近一次生成快照之后更改的所有数据。
RDB是保存数据库中的键值对来记录数据库状态。

AOF持久化方式:
AOF通过保存Redis数据库执行的写命令来记录数据库状态的。AOF持久化会将Redis的写命令写到AOF文件的末尾。
AOF持久化方式
AOF文件的写入和同步
为了提高文件的写入效率,都会将数据先写入到缓存当中。这样虽然效率提高,但是写入数据带来了安全问题,如果计算机发生停机,缓存中的数据可能会丢失。
可以通过设置appendfsync选项的值来决定AOF持久化的效率和数据安全

appendfsync的参数设置
always:将缓冲区的所有内容写入并同步到AOF文件,安全性最高,效率最低
everysec:每秒执行一次同步
no:何时进行同步,由操作系统来决定

Redis载入AOF文件进行数据还原
这里写图片描述
AOF文件的重写和压缩

虽然AOF持久化可以将丢失数据的时间降低至一秒(甚至不丢失数据),又可以在极短的时间内完成数据的持久化。但是因为Redis会不断的将执行的写命令记录到AOF文件里面,随着Redis的不断运行,AOF文件也会也来越大。Redis在重启之后需要通过执行AOF文件记录的所有写命令来还原数据库,如果AOF文件过大,还原的时间可能会非常的长。

为了解决AOF文件不断增大的问题,可以通过移除AOF文件冗余命令来重写AOF文件,使得AOF文件的体积变得尽可能的小。Redis会创建子进程,由子进程来负责对AOF文件的重写。服务器进程继续来处理命令。使用子进程不使用线程,可以保证数据的安全。

AOF重写缓冲区

在子进程进行AOF文件重写的时候,服务器进程还会继续处理命令,
新的命令可能会对数据库状态进行修改。可能会使得服务器当前的数据状态
和重写后的AOF文件所保存的数据库状态不一致。

为了解决数据不一致的问题,Redis服务器设置了一个AOF文件重写的缓冲区。这个缓冲区在创建子进程重写AOF文件后开始使用,当Redis服务器执行完写命令的之后,会同时将这个写命令发送给AOF和AOF重写缓冲区。
这样一来可以保证:

AOF缓冲区中的内容会被定期的写入和同步到AOF文件
从创建子进程开始,服务器执行的所有写命令会记录到AOF重写缓冲区

子进程完成AOF文件重写之后,会向父进程发送信号,父进程会

将AOF重写缓冲区的所有内容写入到新的AOF文件,
这时候AOF文件的数据库状态和服务器一致
对新的AOF文件进行改名,原子地覆盖现有的AOF文件

这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_27046951/article/details/82195042