Redis持久化完整版本

1. Redis持久化简介

Redis是一种内存数据结构存储系统,但也可以持久化数据以便断电后数据不会丢失。Redis支持两种类型的持久化方式:RDB(Redis Database)和AOF(Append Only File)。

1.1 RDB持久化

RDB是将Redis的内存数据结构保存到磁盘上。Redis可以定期将内存中的数据转储到磁盘上,这个过程称为快照。快照可以手动或自动进行。Redis会将快照保存到一个RDB文件中。

下面是一个保存RDB文件的配置示例:

save 900 1

save 300 10

save 60 10000

这个配置表示,在900秒内如果发生了至少1个键值对的改变,Redis就会进行一次快照;在300秒内如果发生了至少10个键值对的改变,Redis就会进行一次快照;在60秒内如果发生了至少10000个键值对的改变,Redis就会进行一次快照。

1.2 AOF持久化

AOF持久化是将Redis的命令记录到一个文件中。Redis会将每一个写命令追加到一个文件末尾。当Redis重新启动时,可以使用AOF文件来重建原来的数据集。

AOF文件中的命令格式如下:

*3

$3SET

$5mykey

$5value

这表示一个SET命令,将键“mykey”的值设置为“value”。第一行是整个命令的参数数,第二行是命令本身的参数数,第三行是参数本身的长度,第四行是参数的内容。

2. RDB持久化的实现

RDB持久化实现过程如下:

Redis主进程fork出一个子进程。

子进程将数据集写入临时文件。

子进程将临时文件重命名为RDB文件。

主进程继续处理命令请求。

可以手动触发RDB持久化操作,即执行SAVE或BGSAVE命令。SAVE命令会阻塞Redis服务器进程,直到RDB文件生成完毕。BGSAVE命令会让Redis创建一个子进程,在子进程中生成RDB文件。由于子进程是由父进程fork出来的,所以生成RDB文件不会影响Redis服务器的正常运行。

2.1 RDB文件格式

RDB文件采用二进制格式。其由多个部分组成:

魔数和版本号。RDB文件的开头是“REDIS”,后面紧跟着四个字节的版本号。

键值对组成的快照。每个键值对由键、值和生存时间组成。

元数据。这部分包含了Redis服务器的一些信息,如数据库结构、主从复制信息、客户端信息等。

RDB文件由Redis服务器自动生成,Redis客户端不能直接编辑RDB文件。需要修改数据的话,必须通过Redis服务器提供的命令接口进行修改。

2.2 RDB实现原理

RDB持久化过程中需要冻结数据库。这是因为在进行快照期间,Redis不能对数据库进行修改。如果不冻结数据库,那么在快照过程中,Redis将会继续接收新的命令请求,这些新的命令请求将会影响快照的一致性。

在BGSAVE命令中,Redis创建一个子进程来执行快照操作。在子进程中,Redis通过创建一个新的事件循环来屏蔽掉父进程的事件循环。子进程本身不接收命令请求,只是向父进程反馈快照完成的消息。

3. AOF持久化的实现

AOF持久化实现过程如下:

Redis主进程执行写入命令。

Redis主进程将写入命令追加到AOF文件中。

文件系统将缓存中的数据刷入磁盘。

AOF持久化过程中Redis主进程不需要fork出子进程。这是因为在AOF持久化过程中,Redis可以持续处理新的命令请求。

3.1 AOF文件格式

AOF文件采用文本格式。其格式如下:

*3

$3SET

$5mykey

$5value

在AOF文件中,每一个命令由一条文本行表示。文件的第一行是上面提到的魔数和版本号。

3.2 AOF持久化的配置

Redis提供了多种AOF持久化的策略:

always。每次写入命令时都会执行fsync操作,将改动刷入磁盘。

everysec。每秒钟执行一次fsync操作,将改动刷入磁盘。

no。不执行fsync操作,由系统根据自己的策略决定何时写入磁盘。

默认情况下,Redis选择了everysec策略。这种策略既能确保数据不容易丢失,又不会频繁地刷磁盘。

3.3 AOF重写

随着时间的推移,AOF文件会不断增大。为了解决这个问题,Redis提供了AOF重写机制。在AOF重写过程中,Redis会创建一个新的AOF文件,用来代替原来的AOF文件。新的AOF文件将包含原来AOF文件的所有命令,但会使用更加紧凑的格式,减少文件的大小。

在AOF重写过程中,Redis主进程会扫描整个数据库,将相关的命令转换为新的AOF格式。这个过程是在后台进行的,对Redis实例的正常运行没有任何影响。重写之后,Redis可以直接加载新的AOF文件,构建出新的数据库。

4. 总结

Redis提供了两种持久化方式:RDB和AOF。

RDB是一种快照机制,将Redis的数据结构转储到磁盘上。

AOF是记录机制,将Redis的命令记录到一个文件中。

AOF文件使用文本格式,可以通过文本编辑器进行修改。

RDB文件使用二进制格式,不能直接修改。

可以通过AOF重写机制来压缩AOF文件的大小。

数据库标签