Redis 持久化之AOF与RDB的区别

Redis有两种持久化策略,即aof与rdb,当我们使用redis不小心宕机的时候,你会发现一个类似redis.dump.rdb的文件,它其实就是redis持久化的一个镜像文件,就是把内存上的数据备份一份到硬盘上,等待下次启动时读取出来,先说说两者的区别

RDB方式

  • RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘,实际操作过程是fork一个子进程,先将数据集写入临时文件,写入成功后,再替换之前的文件,用二进制压缩存储

AOF方式

  • AOF持久化以日志的形式记录服务器所处理的每一个写、删除操作,查询操作不会记录,以文本的方式记录,可以打开文件看到详细的操作记录。

从这两种方式的工作原理可以看出他们的优缺点,先说说RDB

优点
  • 因为是定时备份的(可以设置每隔多少秒,有多少个key发生变化进行备份)。在数据恢复的时候数据可以快速完整恢复数据

  • 对于灾难恢复而言,因为我们可以非常轻松的将一个单独的文件压缩后再转移到其它存储介质上。

  • 因为是子进程进行备份,并不会影响到服务器进程,对服务器性能影响少。

  • 相比于AOF机制,如果数据集很大,RDB的启动效率会更高,因为AOF是以追加的形式记录操作,类似于日志,所以文件比较大

缺点
  • 如果数据量很大,每次到了定时备份的时候,那么在备份的时候子进程占用的cpu以及io开销会比较大,
  • 如果备份的时候主进程有数据更新,那么更新的这部分数据不会被备份,从而导致数据准确性上有一定机会产生误差

再说说AOF 的优点

优点
  • 弥补了RDB的数据误差的缺点,因为每次操作都会以日志的形式追加,不会出现数据不一致,不准确的情况
  • 如果日志过大,Redis可以自动启用rewrite机制
缺点
  • 如果选择每次更新都同步到持久化文件上,则执行效率没有RDB那么高
  • 因为每次操作或者每秒钟都同步到持久化文件上,则持久化文件占用的空间会比较大
    二者选择的标准,就是看系统是愿意牺牲一些性能,换取更高的缓存一致性(aof),还是愿意写操作频繁的时候,不启用备份来换取更高的性能,待手动运行save的时候,再做备份(rdb)。rdb这个就更有些 eventually consistent的意思了。

Redis会将数据集的快照dump到dump.rdb文件中。此外,我们也可以通过配置文件来修改Redis服务器dump快照的频率,在打开redis.conf文件之后,我们搜索save,可以看到下面的配置信息:

save 900 1 #在900秒(15分钟)之后,如果至少有1个key发生变化,则dump内存快照。

save 300 10 #在300秒(5分钟)之后,如果至少有10个key发生变化,则dump内存快照。

save 60 10000 #在60秒(1分钟)之后,如果至少有10000个key发生变化,则dump内存快照。

AOF持久化配置

在Redis的配置文件中存在三种同步方式,它们分别是:

appendfsync always #每次有数据修改发生时都会写入AOF文件。

appendfsync everysec #每秒钟同步一次,该策略为AOF的缺省策略。

appendfsync no #从不同步。高效但是数据不会被持久化。

你可能感兴趣的:(Redis 持久化之AOF与RDB的区别)