这里写目录标题

  • 15.2 AOF持久化
  • 15.2.1 打开AOF持久化功能
  • 15.2.2 设置AOF文件的冲洗频率
  • 15.2.3 AOF重写
    • 1.BGREWRITEAOF命令
      • 其他信息
    • 2.AOF重写配置选项
  • 15.2.4 AOF持久化的优缺点
  • 参考目录

15.2 AOF持久化

全量式的RDB持久化功能不同AOF提供的是增量式的持久化功能, 这种持久化的核心原理在于:服务器每次执行完写命令之后,都会以协议文本的方式将被执行的命令追加到AOF文件的末尾。这样一来,服务 器在停机之后,只要重新执行AOF文件中保存的Redis命令,就可以将 数据库恢复至停机之前的状态。

作为例子,表15-3展示了一个Redis服务器生成AOF文件的过程。

从表15-3中可以看到,随着服务器不断地执行命令,被执行的命令也会 不断地被保存到AOF文件中(文件中唯一不是用户执行的命令SELECT 0是服务器根据用户正在使用的数据库号码自动加上的)。这样一来, 即使服务器在T4停机,它也可以在重启时通过重新执行AOF文件包含的 命令来恢复数据。对于表15-3中展示的例子来说,服务器只要重新执行 AOF文件中包含的4个命令,就可以让数据库重新回到停机之前的状 态。

为了方便展示,本书在介绍AOF相关内容时,通常会直接写出被执行的命令,但是在实际的AOF文件中,命令都是以Redis网络协议的方式保存的。比如,对于表15-3所示的情况,服务器将创建一个包含代码清单 15-1所示内容的AOF文件(为了能够清晰地辨别各个命令,清单将每个 命令都单独列为一行)。

15.2.1 打开AOF持久化功能

用户可以通过服务器的appendonly选项来决定是否打开AOF持久化功能

如果用户想要开启AOF持久化功能,那么只需要将这个值设置为yes即可:

反之,如果用户想要关闭AOF持久化功能,那么只需要将这个值设置为 no即可:

当AOF持久化功能处于打开状态时,Redis服务器在默认情况下将创建 一个名为appendonly.aof的文件作为AOF文件。

15.2.2 设置AOF文件的冲洗频率

为了提高程序的写入性能,现代化的操作系统通常会把针对硬盘的多次写操作优化为一次写操作。具体的做法是,当程序调用write系统调用对 文件进行写入时,系统并不会直接把数据写入硬盘,而是会先将数据写 入位于内存的缓冲区中,等到指定的时限到达或者满足某些写入条件 时,系统才会执行flush系统调用,将缓冲区中的数据冲洗至硬盘。

这种优化机制虽然提高了程序的性能,但是也给程序的写入操作带来了不确定性,特别是对于AOF这样的持久化功能来说,AOF文件的冲洗机制将直接影响AOF持久化的安全性。为了消除上述机制带来的不确定 性,Redis向用户提供了appendfsync选项,以此来控制系统冲洗AOF文件的频率

appendfsync选项拥有always、everysec和no 3个值可选,它们代表的意义分别为:

always——每执行一个写命令,就对AOF文件执行一次冲洗操作。

·everysec——每隔1s,就对AOF文件执行一次冲洗操作。

·no——不主动对AOF文件执行冲洗操作,由操作系统决定何时对AOF 进行冲洗。

这3种不同的冲洗策略不仅会直接影响服务器在停机时丢失的数据量, 还会影响服务器在运行时的性能:

·在使用always值的情况下,服务器在停机时最多只会丢失一个命令的数 据,但使用这种冲洗方式将使Redis服务器的性能降低至传统关系数据 库的水平。

·在使用everysec值的情况下,服务器在停机时最多只会丢失1s之内产生的命令数据,这是一种兼顾性能和安全性的折中方案。

·在使用no值的情况下,服务器在停机时将丢失系统最后一次冲洗AOF 文件之后产生的所有命令数据,至于数据量的具体大小则取决于系统冲 洗AOF文件的频率。

因为no策略给可能丢失的数据量带来了不确定性,而always策略对于安 全性的追求又牺牲了服务器的性能,所以Redis使用everysec作为 appendfsync选项的默认值。除非有明确的需求,否则用户不应该随意修改appendfsync选项的值。

15.2.3 AOF重写

随着服务器不断运行,被执行的命令将变得越来越多,而负责记录这些 命令的AOF文件也会变得越来越大。与此同时,如果服务器曾经对相同 的键执行过多次修改操作,那么AOF文件中还会出现多个冗余命令。

举个例子,对于代码清单15-2所示的AOF文件:

文件中的3组命令分别对msg、fruits和job-queue 3个键进行了多次修改, 但是这些命令对数据库的最终修改效果实际上可以简化为以下4条命令:

·SELECT 0

·SET msg"happy birthday!"

·SADD fruits"apple"“banana”“cherry”"durian"

·RPUSH job-queue 1008612345256512

冗余命令的存在不仅增加了AOF文件的体积,并且因为Redis服务器在 停机之后需要通过重新执行AOF文件中保存的命令来恢复数据,所以 AOF文件中的冗余命令越多,恢复数据时耗费的时间也会越多。为了减 少冗余命令,让AOF文件保持“苗条”,并提供数据恢复操作的执行速 度,Redis提供了AOF重写功能,该功能能够生成一个全新的AOF文件,并且文件中只包含恢复当前数据库所需的尽可能少的命令。

举个例子,如果我们对代码清单15-2所示的AOF文件执行AOF重写操 作,那么Redis将生成代码清单15-3所示的AOF文件,该文件只包含了上 述提到的4个命令:

用户可以通过执行BGREWRITEAOF命令或者设置相关的配置选项触发AOF重写操作,接下来将分别介绍这两种触发方法。

1.BGREWRITEAOF命令

用户可以通过执行BGREWRITEAOF命令显式地触发AOF重写操作,该命令是一个无参数命令

BGREWRITEAOF命令是一个异步命令,Redis服务器在接收到该命令之 后会创建出一个子进程,由它扫描整个数据库并生成新的AOF文件。当 新的AOF文件生成完毕,子进程就会退出并通知Redis服务器(父进 程),然后Redis服务器就会使用新的AOF文件代替已有的AOF文件, 借此完成整个重写操作。

关于BGREWRITEAOF还有两点需要注意首先,如果用户发送 BGREWRITEAOF命令请求时,服务器正在创建RDB文件,那么服务器 将把AOF重写操作延后到RDB文件创建完毕之后再执行,从而避免两个 写硬盘操作同时执行导致机器性能下降;其次,如果服务器在执行重写操作的过程中,又接收到了新的BGREWRITEAOF命令请求,那么服务 器将返回以下错误:

其他信息

复杂度:O(N),其中N为Redis服务器所有数据库包含的键值对总数量。

版本要求:BGREWRITEAOF命令从Redis 1.0.0版本开始可用。

2.AOF重写配置选项

用户除了可以手动执行BGREWRITEAOF命令创建新的AOF文件之外, 还可以通过设置以下两个配置选项让Redis自动触发BGREWRITEAOF命令

其中auto-aof-rewrite-min-size选项用于设置触发自动AOF文件重写所需 的最小AOF文件体积,当AOF文件的体积小于给定值时,服务器将不会 自动执行BGREWRITEAOF命令。在默认情况下,该选项的值为:

        也就是说,如果AOF文件的体积小于64MB,那么Redis将不会自动执行 BGREWRI-TEAOF命令。

至于另一个选项,它控制的是触发自动AOF文件重写所需的文件体积增大比例。举个例子,对于该选项的默认值:

表示如果当前AOF文件的体积比最后一次AOF文件重写之后的体积增大了一倍(100%),那么将自动执行一次BGREWRITEAOF命令如果 Redis服务器刚刚启动,还没有执行过AOF文件重写操作,那么启动服务器时使用的AOF文件的体积将被用作最后一次AOF文件重写的体积。

举个例子,如果服务器启动时AOF文件的体积为200MB,而auto-aof- rewrite-percentage选项的值为100,那么当AOF文件的体积增大至超过 400MB时,服务器就会自动进行一次AOF重写。与此类似,在同样设置 下,如果AOF文件的体积从最后一次重写之后的300MB增大至超过 600MB,那么服务器将再次执行AOF重写操作。

15.2.4 AOF持久化的优缺点

与RDB持久化可能会丢失大量数据相比,AOF持久化的安全性要高得多:通过使用everysec选项,用户可以将数据丢失的时间窗口限制在1s 之内。

但是与RDB持久化相比,AOF持久化也有相应的缺点:

·首先,因为AOF文件存储的是协议文本,所以它的体积会比包含相同 数据、二进制格式的RDB文件要大得多并且生成AOF文件所需的时间 也会比生成RDB文件所需的时间更长。

·其次,因为RDB持久化可以直接通过RDB文件恢复数据库数据,而 AOF持久化则需要通过执行AOF文件中保存的命令来恢复数据库前者 是直接的数据恢复操作,而后者则是间接的数据恢复操作),所以RDB 持久化的数据恢复速度将比AOF持久化的数据恢复速度快得多,并且数 据库体积越大,这两者之间的差距就会越明显。

·最后,因为AOF重写使用的BGREWRITEAOF命令与RDB持久化使用 的BGSAVE命令一样都需要创建子进程,所以在数据库体积较大的情况 下,进行AOF文件重写将占用大量资源,并导致服务器被短暂地阻塞。

参考目录

绝大多数 内容来自 Redis使用手册 (黄健宏 著) 第15章 持久化

Redis 中的 持久化 AOF持久化 打开AOF持久化功能 设置AOF文件的冲洗频率 AOF重写 AOF持久化的优缺点相关推荐

  1. Redis中哈希hash数据类型(增加修改(设置单一属性、设置多个属性)、获取(获取键所有属性、获取单一属性值、获取多个属性值)、删除、使用hash可能出现的问题)

    hash⽤于存储对象,对象的结构为属性.值 值的类型为string [应用:如购物车内某个宝贝的所有属性]  [help hset] 1. 增加.修改 1.1 设置单个属性 hset key fiel ...

  2. 阿里二面:Redis 中的 AOF 文件太大了怎么办?

    一.前言 写这篇文章的目的是来自我的一位粉丝的投稿,说面试阿里被问到了这个问题.不得不说阿里的面试问的都挺有质量,一般的我们只会关注 Redis 的两种持久化方式 RDB 和 AOF.但老周这里盲猜面 ...

  3. Redis 中常见的 15个坑,你踩过几个?

    Redis 是我们系统开发中必须要用到的一个组件,那它都有哪些需要主要的地方呢?本文我们就来盘点一下 Redis 中常见的一些坑: 明明一个 key 设置了过期时间,怎么变成不过期了? 使用 O(1) ...

  4. Redis中的键值过期操作

    1.过期设置 Redis 中设置过期时间主要通过以下四种方式: expire key seconds:设置 key 在 n 秒后过期: pexpire key milliseconds:设置 key ...

  5. Redis实战案例及问题分析之好友关注功能(关注、共同好友、消息推送)

    关注和取关 需求:基于该表数据结构,实现两个接口 关注和取关接口 @Overridepublic Result follow(Long followUserId, Boolean isFollow) ...

  6. webstorm打开新项目提示设置、是否在新窗口打开提示

    方法一:webstorm打开新项目提示设置: 文件→设置(Ctrl+Alt+S)→外观和行为→常规→Project Opening→Confirm window to open project in. ...

  7. Redis中两种持久化机制RDB和AOF

    redis是一个内存数据库,数据保存在内存中,但是我们都知道内存的数据变化是很快的,也容易发生丢失.幸好Redis还为我们提供了持久化的机制,分别是RDB(Redis DataBase)和AOF(Ap ...

  8. Redis 中的 持久化 RDB持久化 SAVE:阻塞服务器并创建RDB文件 BGSAVE:以非阻塞方式创建RDB文件 通过配置选项自动创建RDB文件

    这里写目录标题 15.1 RDB持久化 15.1.1 SAVE:阻塞服务器并创建RDB文件 其他信息 15.1.2 BGSAVE:以非阻塞方式创建RDB文件 其他信息 15.1.3 通过配置选项自动创 ...

  9. Redis中持久化的两种方法详解

    Redis提供了两种不同的持久化方法来将数据存储到硬盘里面.一种方法叫快照(snapshotting),它可以将存在于某一时刻的所有数据都写入硬盘里;另一种方法教只追加文件(append-only f ...

最新文章

  1. java list反序列化_java序列化与反序列化操作实例分析
  2. ipad流水布局及其旋转界面view间隔布局调整
  3. python2.7安装使用thulac库时遇到的一些问题
  4. Fckeditor配置 for ASP.NET
  5. 阿里妈妈技术团队 6 篇论文入选 CIKM 2021
  6. 计算机模拟专业,2017年数值模拟专业知识题库
  7. 微软3月补丁星期二最值得注意的是CVE-2020-0684和神秘0day CVE-2020-0796
  8. [安装项目]不可恢复的生成错误
  9. 如果发现头目玩阴谋,要小心
  10. 引力子与黑格斯粒子是否超对称
  11. cad导出pdf_CAD如何导出高分辨率图片
  12. java smali_如何把java代码转换成smali代码
  13. 机器学习入门算法及其java实现-EM(Expectation Maxium)算法
  14. ai如何置入_ai中更新置入图片链接的具体步骤介绍
  15. brpc源码解析(四)—— Bthread机制
  16. find,link,dhcp
  17. 帕金森病的功能性脑连接障碍:一项5年的纵向研究
  18. 【C语言】BC62统计数据正负数个数(DAY 4)
  19. 香帅的北大金融学课笔记1 -- 金融世界观
  20. ICS/SCADA虚拟化的安全性影响:调查和未来趋势

热门文章

  1. Kafka原理--超详细(学习笔记)
  2. 一款实用的机器翻译API
  3. SSD+HDD安装win7
  4. 云隐-设计模式解析与实战
  5. KZGO-A-031/315比例减压阀控制器
  6. 前端面试之浏览器内核
  7. 非常流行的防弹皮革摩托车背心运动车员
  8. [iOS]iPhoto的删除动画(转)
  9. 边缘检测拉普拉斯c语言,如何用 OpenCV、Python 和拉普拉斯算子来计算图片中的模糊量...
  10. spring boot 2.1学习笔记【二十】SpringBoot 2 freemarker bootstrap 集成