zoukankan      html  css  js  c++  java
  • 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 文件都是绝对安全的。

  • 相关阅读:
    二进制位运算
    Leetcode 373. Find K Pairs with Smallest Sums
    priority_queue的用法
    Leetcode 110. Balanced Binary Tree
    Leetcode 104. Maximum Depth of Binary Tree
    Leetcode 111. Minimum Depth of Binary Tree
    Leetcode 64. Minimum Path Sum
    Leetcode 63. Unique Paths II
    经典的递归练习
    案例:java中的基本排序
  • 原文地址:https://www.cnblogs.com/danyuzhu11/p/15387358.html
Copyright © 2011-2022 走看看