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

来源:互联网 发布:怎样开通淘宝食品 编辑:程序博客网 时间:2024/05/29 17:28

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 1save 300 10save 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 0SADD fruits "apple"SADD fruits "banana"SADD fruits "cherry"SADD fruits "apple"INCR counterINCR counterDEL counterSET msg "hello world"SET msg "goodbye"SET msg "hello world again!"RPUSH lst 1 3 5RPUSH lst 7 9LPOP lstRPOP lst

重写产生的新 AOF 文件

SELECT 0SADD 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 数据库的持久化方式是一样的。
0 0
原创粉丝点击