Redis系列学习笔记18 Redis持久化

Redis持久化

  • RDB持久化:将数据以二进制文件的形式存到硬盘里面。
  • AOF持久化:增量存储至硬盘里面。

在Redis服务器创建RDB文件的情况中,以下三种是最常见的:

  • 服务器执行客户端发送的SAVE命令;
  • 服务器执行客户端发送的BASAVE命令;
  • 使用save配置选项设置的自动保存条件被满足,服务器自动执行BGSAVE。

SAVE

在执行SAVE命令的过程中,Redis服务器将被阻塞,无法处理客户端发送的命令请求,只有在SAVE命令执行完毕之后,服务器才会重新开始处理客户端发送的命令请求。

BGSAVE

与SAVE不同的是不会造成Redis服务器阻塞,原因:

  • Redis接收到BGSAVE命令时,不会创建RDB文件,而是通过fork()来生成一个子进程,然后由子进程负责创建RDB文件,而自己则继续处理客户端的命令请求;
  • 当子进程创建好RDB文件并退出时,会向父进程发送一个信号,告知RDB文件创建完毕;
  • 最后Redis服务器接收子进程创建的RDB文件,BGSAVE执行完毕。

自动保存

save 300 10

表示”如果距离上一次创建RDB文件过去了300秒,并且服务器的所有数据库总共已经发生了不少于10次修改,那么执行BGSAVE命令”。

save 900 1
save 300 10
save 60 10000

只要三个条件中的任意一个被满足时,服务器就会执行BGSAVE。

RDB持久化缺点:

RDB文件需要将服务器所有数据库的数据都保存起来,这是一个非常耗费资源和时间的操作,所以服务器需要隔一段时间才创建一个新的RDB文件,也即是说,创建RDB文件的操作不能执行得过于频繁,否则就会严重地影响服务器的性能。

为了解决RDB持久化在遭遇意外停机时丢失大量数据的问题,Redis提供了AOF持久化功能。AOF持久化的一个巨大优势是,用户可以根据自己的需要对AOF持久化进行调整,让Redis在遭遇意外停机时不丢失任何数据,或者只丢失一秒钟数据。

AOF提供了appendfsync选项,这个选项的值可以是always、everysec或者no

  • always:服务器每写入一个命令,就调用一次fdatasync,将缓冲区里面的命令写入到硬盘里面。在这种模式下,服务器即使遭遇意外停机,也不会丢失任何已经执行得命令数据。
  • everysec:服务器每秒钟调用一次fdatasync,将缓冲区里面的命令写入到硬盘里面。在这种模式下,服务器遭遇意外停机,最多只丢失一秒钟内执行得命令数据。
  • no:服务器不主动调用fdatasync,由操作系统决定何时将缓冲区里面的命令写入到硬盘里面。在这种模式下,服务器遭遇意外停机时,丢失命令的数量是不确定的。

运行速度:always的速度慢,everysec和no都很快。默认值:everysec。

AOF重写

创建一个没有冗余内容的新AOF文件

AOF 重写示例

原有的 AOF 文件

SELECT 0
SADD fruits "apple"
SADD fruits "banana"
SADD fruits "cherry"
SADD fruits "apple"
INCR counter
INCR counter
DEL counter
SET msg "hello world"
SET msg "goodbye"
SET msg "hello world again!"
RPUSH lst 1 3 5
RPUSH lst 7 9
LPOP lst
RPOP lst

重写产生的新 AOF 文件

SELECT 0
SADD fruits "apple" "banana" "cherry"
SET msg "hello world"
RPUSH lst 3 5 7

触发AOF重写的两种方法

  • 客户端向服务器发送BGREWRITEAOF命令。
  • 通过设置配置选项来让服务器自动执行BGREWRITEAOF命令,它们分别是:

    • auto-aof-rewrite-min-size size,触发AOF重写所需的最小体积:只有在AOF文件的体积大于等于size时,服务器才会考虑是否需要进行AOF重写。这个选项避免对体积过小的AOF文件进行重写。
    • auto-aof-rewrite-percentage percent, 指定触发重写所需的AOF文件体积百分比:当AOF文件的体积大于auto-aof-rewrite-min-size指定的体积,并且超过上一次重写之后的AOF文件体积的percent%时,就会触发AOF重写。
RDB 持久化 AOF 持久化
全量备份,一次保存整个数据库。 增量备份,一次保存一个修改数据库的命令。
保存的间隔较长。 保存的间隔默认为一秒钟。
数据还原速度快。 数据还原速度一般。冗余命令越多, 还原速度越慢。
执行 SAVE 命令时会阻塞服务器,但手动或者自动触发的 BGSAVE 都不会阻塞服务器。 无论是平时还是进行 AOF 重写时,都不会阻塞服务器。
更适合数据备份。 更适合用来保存数据,通常意义上的数据持久化。在 appendfsync always 模式下运行时,Redis 的持久化方式和一般的 SQL 数据库的持久化方式是一样的。

你可能感兴趣的:(Redis)