redis持久化-RDB和AOF对比

 

RDB持久化

AOF持久化

全量备份,一次保存整个数据库

增量备份,一次保存一个修改数据库的命令

保存的间隔较长

保存的间隔默认一秒

数据还原速度快

数据还原速度一般

save会阻塞,但bgsave或者自动不会阻塞

无论是平时还是AOF重写,都不会阻塞

更适合数据备份,默认开启

更适合用来保存数据,和一般SQL持久化方式一样,默认关闭

启动优先级 : 低

启动优先级 : 高

体积 : 小

体积 : 大

恢复速度 : 快

恢复速度 : 慢

数据安全性 : 丢数据

数据安全性 : 根据策略决定

轻重 : 重

轻重: 轻

1.在dump rdb过程中,aof如果停止同步,会不会丢失?  #

不会,所有的操作缓存在内存队列里,dump完后后,统一操作

2.aof重写是什么?#

aof重写就是把内存中的数据逆化成命令,写入到aof文件,以解决aof日志过大的问题

3.如果rdb和aof文件都存在,优先使用谁恢复数据?#

在这种情况下,当redis重启的时候会优先载入AOF文件来恢复原始的数据,因为在通常情况下AOF文件保存的数据集要比RDB文件完整

4.rdb和aof是否可以同时用?#

可以,推荐同时使用

5.恢复时,rdb和aof哪个更快?#

rdb快,因为rdb是数据的内存映射,直接载入到内存,而aof是命令,需要逐条执行

6.如何在不用【config set】命令的情况下,将Redis持久化由RDB切换到AOF#

利用主从,从机配置AOF重启后,将生成的AOF文件复制至主机Redis数据目录,主机配置AOF后再重启。

注:在 Redis 2.2 或以上版本,通过【config set】可以在不重启的情况下,从 RDB 切换到 AOF。

1)为最新的 dump.rdb 文件创建一个备份。

2)将备份放到一个安全的地方。

3)执行以下两条命令: redis-cli> CONFIG SET appendonly yes redis-cli> CONFIG SET save ""

4)确保命令执行之后,数据库的键的数量没有改变。

5)确保写命令会被正确地追加到 AOF 文件的末尾。

步骤 3 执行的第一条命令开启了AOF功能:<font style="color:red">Redis会阻塞直到初始AOF文件创建完成为止</font>,之后Redis会继续处理命令请求, 并开始将写入命令追加到 AOF 文件末尾。

步骤 3 执行的第二条命令用于关闭RDB功能。这一步是可选的,如果你愿意的话,也可以同时使用RDB和AOF这两种持久化功能。

不过别忘了在redis.conf中打开AOF功能!否则的话,服务器重启之后,之前通过【CONFIG SET】设置的配置就会被遗忘,程序会按原来的配置来启动服务器。

---------------------------------------------------------------------------------------------------------------------------------------------------
rdb的特性如下:
fork一个进程,遍历hash table,利用copy on write,把整个db dump保存下来。
save, shutdown, slave 命令会触发这个操作。
粒度比较大,如果save, shutdown, slave 之前crash了,则中间的操作没办法恢复。
aof有如下特性:
把写操作指令,持续的写到一个类似日志文件里。(类似于从postgresql等数据库导出sql一样,只记录写操作)
粒度较小,crash之后,只有crash之前没有来得及做日志的操作没办法恢复。

两种区别就是,一个是持续的用日志记录写操作,crash后利用日志恢复;一个是平时写操作的时候不触发写,只有手动提交save命令,或者是关闭命令时,才触发备份操作。

选择的标准,就是看系统是愿意牺牲一些性能,换取更高的缓存一致性(aof),还是愿意写操作频繁的时候,不启用备份来换取更高的性能,待手动运行save的时候,再做备份(rdb)。rdb这个就更有些 eventually consistent的意思了

Redis 持久化:

提供了多种不同级别的持久化方式:一种是RDB,另一种是AOF.

RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot)。

AOF 持久化记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集。 AOF 文件中的命令全部以 Redis 协议的格式来保存,新命令会被追加到文件的末尾。 Redis 还可以在后台对 AOF 文件进行重写(rewrite),使得 AOF 文件的体积不会超出保存数据集状态所需的实际大小。Redis 还可以同时使用 AOF 持久化和 RDB 持久化。 在这种情况下, 当 Redis 重启时, 它会优先使用 AOF 文件来还原数据集, 因为 AOF 文件保存的数据集通常比 RDB 文件所保存的数据集更完整。你甚至可以关闭持久化功能,让数据只在服务器运行时存在。


了解 RDB 持久化和 AOF 持久化之间的异同是非常重要的, 以下几个小节将详细地介绍这这两种持久化功能, 并对它们的相同和不同之处进行说明。

RDB 的优点:
redis-cli> CONFIG SET save " "<br=""> 确保命令执行之后,数据库的键的数量没有改变。
确保写命令会被正确地追加到 AOF 文件的末尾。
步骤 3 执行的第一条命令开启了 AOF 功能: Redis 会阻塞直到初始 AOF 文件创建完成为止, 之后 Redis 会继续处理命令请求, 并开始将写入命令追加到 AOF 文件末尾。
步骤 3 执行的第二条命令用于关闭 RDB 功能。 这一步是可选的, 如果你愿意的话, 也可以同时使用 RDB 和 AOF 这两种持久化功能。
别忘了在 redis.conf 中打开 AOF 功能! 否则的话, 服务器重启之后, 之前通过 CONFIG SET 设置的配置就会被遗忘, 程序会按原来的配置来启动服务器。

RDB 和 AOF 之间的相互作用:
在版本号大于等于 2.4 的 Redis 中, BGSAVE 执行的过程中, 不可以执行 BGREWRITEAOF 。 反过来说, 在 BGREWRITEAOF 执行的过程中, 也不可以执行 BGSAVE 。
这可以防止两个 Redis 后台进程同时对磁盘进行大量的 I/O 操作。
如果 BGSAVE 正在执行, 并且用户显示地调用 BGREWRITEAOF 命令, 那么服务器将向用户回复一个 OK 状态, 并告知用户, BGREWRITEAOF 已经被预定执行: 一旦 BGSAVE 执行完毕, BGREWRITEAOF 就会正式开始。当 Redis 启动时, 如果 RDB 持久化和 AOF 持久化都被打开了, 那么程序会优先使用 AOF 文件来恢复数据集, 因为 AOF 文件所保存的数据通常是最完整的。

备份 Redis 数据:
Redis 对于数据备份是非常友好的, 因为你可以在服务器运行的时候对 RDB 文件进行复制: RDB 文件一旦被创建, 就不会进行任何修改。 当服务器要创建一个新的 RDB 文件时, 它先将文件的内容保存在一个临时文件里面, 当临时文件写入完毕时, 程序才使用  原子地用临时文件替换原来的 RDB 文件。这也就是说, 无论何时, 复制 RDB 文件都是绝对安全的。

原文地址:https://www.cnblogs.com/danyuzhu11/p/15387358.html