一、什么是AOF

它也是Redis持久化的重要手段之一,aof-》Append Only File,只追加文件,也就是每次处理完请求命令后都会将此命令追加到aof文件的末尾。而RDB是压缩成二进制等时机开子进程去干这件事。

二、优缺点

1、优点

持久化的速度快,因为每次都只是追加,rdb每次都全量持久化

数据相对更可靠,丢失少,因可以配置每秒持久化、每个命令执行完就持久化

2、缺点

灾难性恢复的时候过慢,因为aof每次都只追加原命令,导致aof文件过大,但是后面会rewrite,但是相对于rdb也是慢的。

会对主进程对外提供请求的效率造成影响,接收请求、处理请求、写aof文件这三步是串行原子执行的。而非异步多线程执行的。Redis单线程!

三、AOF原理

1、基础原理

就是每次都在aof文件后面追加命令。他与主进程收到请求、处理请求是串行化的,而非异步并行的。图示如下

所以aof的频率高的话绝逼会对Redis带来性能影响,因为每次都是刷盘操作。跟mysql一样了。Redis每次都是先将命令放到缓冲区,然后根据具体策略(每秒/每条指令/缓冲区满)进行刷盘操作。如果配置的always,那么就是典型阻塞,如果是sec,每秒的话,那么会开一个同步线程去每秒进行刷盘操作,对主线程影响稍小。

文件写入和保存

2、额外扩展

其实Redis每次在写入AOF缓冲区之前,他都会调用flushAppendOnlyFile(),判断是否需要将AOF缓冲区的内容写入和同步到AOF文件中。这个决策是由配置文件的三个策略来控制的

always

everysec

no

1.always:总是保存,每执行一个命令保存一次。

2.everysec:每一秒钟保存一次。

3.no:不保存,操作系统来决定什么时候保存保存。

四、REWRITE

1、为什么要rewrite?

比如我有业务很简单,就来回delete set 同一个key。就这个业务运行了10年,那么aof文件将记录无数个delete k1, set k1 xxx。其实都是重复的,但是我aof每次都追加,文件变成了1T大小。这时候Redis宕机了,要恢复,你想想1TB大小的aof文件去恢复,累死了。最主要的是1TB大小只记录了两个命令,所以压缩其实就是来处理这件事的。

2、4.0版本之前的rewrite

Redis4.0之前和Redis4.0的rewrite(重写)方式不一样,Redis4.0之前就是将aof文件中重复的命令给去掉。保留最新的命令。进而减少aof文件大小。比如

set k1 123
set k1 345
del k1
set k1 789

经过rewrite后(Redis4.0之前),只会变成如下

set k1 789

3、4.0版本以及之后的rewrite

4.0之前的做法效率很是低下,需要逐条命令对比。4.0开始的rewrite支持混合模式(也是就是rdb和aof一起用),直接将rdb持久化的方式来操作将二进制内容覆盖到aof文件中(rdb是二进制,所以很小),然后再有写入的话还是继续append追加到文件原始命令,等下次文件过大的时候再次rewrite(还是按照rdb持久化的方式将内容覆盖到aof中)。但是这种模式也是配置的,默认是开,也可以关闭。

4、rewrite触发条件

1、手动触发

客户端执行bgrewriteaof命令

2、自动触发

通过以下两个配置协作触发

  • auto-aof-rewrite-min-size

AOF文件最小重写大小,只有当AOF文件大小大于该值时候才可能重写,4.0默认配置64mb。

  • auto-aof-rewrite-percentage

当前AOF文件大小和最后一次重写后的大小之间的比率等于或者等于指定的增长百分比, 如100代表当前AOF文件是上次重写的两倍时候才重写。

3、触发满足条件

  • 没有BGSAVE命令(RDB持久化)/AOF持久化在执行
  • 没有BGREWRITEAOF在进行;

前两点也就是说只允许同时fork()一个子进程出来干活。

  • 当前AOF文件大小要大于server.aof_rewrite_min_size的值;
  • 当前AOF文件大小和最后一次重写后的大小之间的比率等于或者大于指定的增长百分比(auto-aof-rewrite-percentage参数)

5、rewrite原理

  1. aof_rewrite_buf:rewrite(重写)缓冲区、aof_buf:写命令存放的缓冲区
  2. 开始bgrewriteaof的时候,判断当前有没有bgsave/bgrewriteaof在执行,若有,则不执行,这个再rdb篇幅也有提到,以及下面很多fork()知识在rdb都有提到。彻底搞懂Redis持久化之RDB原理
  3. 主进程fork()出子进程,在执行fork()这个方法的时候是阻塞的,子进程创建完毕后就不阻塞了
  4. 主进程fork完子进程后,主进程能继续接收客户端的请求,所有写命令依然是写入AOF文件缓冲区并根据配置文件的策略同步到磁盘的。
  5. 因为fork的子进程仅仅共享主进程fork()时的内存,后期主进程在更改内存数据,子进程是不可见的。因此Redis采取重写缓冲区(aof_rewite_buf)保存fork之后的客户端请求。防止新AOF文件生成期间丢失主进程执行的新命令所生成的数据。所以此时客户端的写请求不仅仅写入原来的aof_buf缓冲区,还写入了重写缓冲区。这就是我为什么用深蓝色的框给他两框到一起的原因。
  6. 子进程通过内存快照的形式,开始生成新的aof文件。
  7. 新aof文件生成完后,子进程向主进程发信号。
  8. 主进程收到信号后,会把重写缓冲区(aof_rewite_buf)中的数据写入到新的AOF文件(主要是避免这部分数据丢失)
  9. 使用新的AOF文件覆盖旧的AOF文件,且标记AOF重写完成。

五、RDB-AOF混合持久化

1、优点

混合持久化结合了RDB持久化 和 AOF 持久化的优点,采取了rdb的文件小易于灾难恢复,同时结合AOF,增量的数据以AOF方式保存了,数据更少的丢失。

2、缺点

兼容性差,一旦开启了混合持久化,在4.0之前版本都不识别该aof文件,同时由于前部分是RDB格式,需要专业的工具来阅读,因为是二进制,所以阅读性较差。

3、原理

混合持久化也是通过bgrewriteaof完成的,所以基本流程和上述一样。不同的是当开启混合模式时,fork出的子进程先将共享的内存副本全量以RDB的方式写入aof。这样提高了速度也极大的缩小了aof文件(毕竟都是二进制)。写完还是通知主进程,然后再将重写缓冲区的内容以AOF方式写入到文件,然后替换旧的aof文件。也就是说这种模式下的aof文件发生rewrite后前半部分是rdb格式(REDIS开头的二进制数据),后半部分是正常的aof追加的命令(重写缓冲区里的)。

4、数据恢复

会优先看是否存在aof文件,若存在则先按照aof文件恢复,因为aof毕竟比rdb全。若aof不存在,则才会查找rdb是否存在。这是默认的机制。毕竟aof文件也rewrite成rdb二进制格式,文件小,易于回复。所以redis会优先采取aof。

十二、Redis持久化之AOF原理相关推荐

  1. Redis数据持久化机制AOF原理分析二

    本文所引用的源码全部来自Redis2.8.2版本. Redis AOF数据持久化机制的实现相关代码是redis.c, redis.h, aof.c, bio.c, rio.c, config.c 在阅 ...

  2. Redis数据持久化机制AOF原理分析一---转

    http://blog.csdn.net/acceptedxukai/article/details/18136903 http://blog.csdn.net/acceptedxukai/artic ...

  3. 二十二、redis持久化之AOF

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

  4. Redis 持久化 RDB/AOF 详解与实践

    目录 一.什么叫持久化? 二.Redis 为什么要持久化? 三.Redis 怎么实现持久化? 四.RDB 方式与 AOF 方式的优势对比 五.RDB 方式与 AOF 方式的缺点对比 六.工作原理 七. ...

  5. [转]Redis持久化存储(AOF与RDB两种模式)

    Redis中数据存储模式有2种:cache-only,persistence; cache-only即只做为"缓存"服务,不持久数据,数据在服务终止后将消失,此模式下也将不存在&q ...

  6. [动图演示]Redis 持久化 RDB/AOF 详解与实践

    Redis 是一个开源( BSD 许可)的,内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件.它支持的数据类型很丰富,如字符串.链表.集 合.以及散列等,并且还支持多种排序功能. 什么叫持 ...

  7. Redis持久化RDB/AOF详解与实践

    Redis 是一个开源( BSD 许可)的,内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件.它支持的数据类型很丰富,如字符串.链表.集 合.以及散列等,并且还支持多种排序功能. 什么叫持 ...

  8. [动图演示]Redis 持久化 RDB/AOF 详解与实践 1

    Redis 是一个开源( BSD 许可)的,内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件.它支持的数据类型很丰富,如字符串.链表.集 合.以及散列等,并且还支持多种排序功能. 什么叫持 ...

  9. 10. Redis持久化之AOF

    10. AOF(Append Only File) 将所有的命令都记录下来,类似histrory的操作, 恢复的时候会将这个文件全执行一遍 10.1 简介 以日志的形式来记录每个写操作,将Redis执 ...

最新文章

  1. cmake 注意事项
  2. readline停止后怎么重新开始_2021,离婚后人生重新开始
  3. 四川网络推广介绍搜索引擎从哪几个方面判断网站质量好坏?
  4. 《面向模式的软件体系结构1--模式系统》读书笔记(5)--- 管理
  5. python程序运行时间计时软件_python中的计时器timeit的使用方法
  6. C#Winform将WebBowser控件替换为Chrome内核
  7. 计算机基础ABCDEF,计算机应用基础-在线作业ABCDEF.docx
  8. 【SAS NOTES】sas对中文的支持
  9. .net foreach 未执行完就到下一行了_PHP五十个提升执行效率的小技巧,和常见问题...
  10. django虚拟环境搭建
  11. 移动前端webApp开发点滴积累20140524
  12. 苹果mac专业文献管理软件:endnote x9
  13. USB接口ID卡读卡器oem软件(vb源代码)
  14. Linux教程+操作系统教程
  15. matlab绘制不同线性的直方图,matlab绘制直方图
  16. gdb 打印参数出错:which is more than max-value-size
  17. linux img文件压缩及解压
  18. 系统优化、美化与清理
  19. 自监督论文阅读笔记 Synergistic Self-supervised and Quantization Learning
  20. 【Python数据分析之pandas01】两个常用的数据结构

热门文章

  1. disconf原理 “入坑”指南
  2. docker 报错:driver failed programming external connectivity on endpoint
  3. 单片机定时器精准定时_用单片机C语言精确延时(定时)的方法
  4. 彻底清除s001_dg 插件
  5. Three.js打造H5里的“3D全景漫游”秘籍
  6. MyEclipse中项目有红色感叹号的解决方法总结
  7. 获取EXCEL表单的行数和列数
  8. USB 2.0 A型、B型、Mini和Micro接口定义及封装
  9. iphoneX 屏幕失灵误区
  10. 苹果X一直黑屏白苹果