Redis持久化-RDB与AOF

RDB:Redis Data Base

是什么

  1. 在指定的时间间隔内将内存中的数据集快照写入磁盘,它恢复时是将快照文件直接读到内存里
  2. Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。RDB的缺点是最后一次持久化后的数据可能丢失。整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。RDB的缺点是最后一次持久化后的数据可能丢失。
  3. fork的作用是复制一个与当前进程一样的进程。新进程的所有数据(变量、环境变量、程序计数器等)数值都和原进程一致,但是是一个全新的进程,并作为原进程的子进程。因此极为消耗资源

备份发生在什么时候

当我们执行flushall指令或者shutdown时,数据库会自动进行备份

备份到哪

备份的位置在redis.conf配置文件中进行配置
在这里插入图片描述
在这里插入图片描述

怎么备份

备份的方式有两种:自动和手动

自动备份

我们可以在redis.conf文件中配置自动备份的条件
在这里插入图片描述

手动备份

可以通过执行save或者gbsave指令让Redis进行备份

  1. save指令:执行save指令后会阻塞其他进程,只进行备份,前台不能进行读写操作
  2. bgsave:bgsave指令会fork一个子进程,进行异步备份,不影响前台操作

怎么禁用备份

  1. 在配置文件中不设置save
  2. 将save的值设为空字符串

备份后怎么恢复

Redis每次启动后都会将redis.conf配置文件中指定的路径和文件名所对应的文件读入内存,以此达到恢复的目的

缺点

  1. 最后一次的数据可能不能进行备份,当Reids出现错误退出时,可能还没来得及备份
  2. 消耗资源,每次备份都需要fork一个子进程

redis.conf其他相关配置

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

AOF:Append Only File

采用什么什么方式进行持久化

AOF采用日志文件的方式实现Redis的持久化,日志文件会记录用户对数据库的每一次写操作(增删改)。当需要恢复时,只需要从头至尾将日志文件记录的命令执行一遍即可。

相关配置

在这里插入图片描述

重写:Rewrite

是什么

AOF采用文件追加方式,文件会越来越大为避免出现此种情况,新增了重写机制,当AOF文件的大小超过所设定的阈值时,Redis就会启动AOF文件的内容压缩,只保留可以恢复数据的最小指令集.可以使用命令bgrewriteaof

重写原理

AOF文件持续增长而过大时,会fork出一条新进程来将文件重写(也是先写临时文件最后再rename),遍历新进程的内存中数据,每条记录有一条的Set语句。重写aof文件的操作,并没有读取旧的aof文件,而是将整个内存中的数据库内容用命令的方式重写了一个新的aof文件,这点和快照有点类似

触发条件

Redis会记录上次重写时的AOF大小,默认配置是当AOF文件大小是上次rewrite后大小的一倍且文件大于64M时触发
在这里插入图片描述

缺点

1.随着记录的增多,日志文件会越来越大
2.恢复速度比RDB慢

两者对比

  1. RDB持久化方式能够在指定的时间间隔能对你的数据进行快照存储
  2. AOF持久化方式记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据,AOF命令以redis协议追加保存每次写的操作到文件末尾。Redis还能对AOF文件进行后台重写,使得AOF文件的体积不至于过大
  3. 只做缓存:如果你只希望你的数据在服务器运行的时候存在,你也可以不使用任何持久化方式。
  4. 同时开启两种持久化方式
    在这种情况下,当redis重启的时候会优先载入AOF文件来恢复原始的数据,因为在通常情况下AOF文件保存的数据集要比RDB文件保存的数据集要完整。RDB的数据不实时,同时使用两者时服务器重启也只会找AOF文件。那要不要只使用AOF呢?作者建议不要,因为RDB更适合用于备份数据库(AOF在不断变化不好备份),快速重启,而且不会有AOF可能潜在的bug,留着作为一个万一的手段。

猜你喜欢

转载自blog.csdn.net/zyp1376308302/article/details/84313803