Redis的AOF持久化策略(AOF的工作流程、AOF的重写流程,操作演示、注意事项等)

文章目录

  • 缓冲AOF 策略(append only file)
  • AOF 的工作流程
  • AOF 缓冲区策略
  • AOF 的重写机制
  • 重写完的AOF文件为什么可以变小?
  • AOF 重写流程

缓冲AOF 策略(append only file)

AOF 的核心思路是 “实时备份“,只要我添加了新的数据或者更新了新的数据,就立刻将数据备份到硬盘中。

在 Redis 的配置文件中,默认是将 AOF 这种方式关闭的,所以我们想要使用 AOF 时,就需要修改一下配置文件,如下图:

在这里插入图片描述

然后重启服务器,就会自动生成一个 aof 文件,aof 文件的位置和 rdb 文件的是一样的,都是在 /var/lib/redis 目录下

在这里插入图片描述

下面我们来设置几个键值对进行测试:

  1. 设置键值对

在这里插入图片描述

  1. 使用 kill -9 杀死redis进程

在这里插入图片描述

当这里杀死完 redis 进程后,由于 unbent 系统的保护措施,会自动再启动一个 redis 服务器

  1. 查看redis内存中的键值对是否进行了备份

从下图可以看到,aof 文件中,已经实时的自动帮我们进行了备份了,并且,也可以看到,这个 aof 文件是一个文本文件。

在这里插入图片描述
在这里插入图片描述

如果我们开启了 AOF,在 aof 文件中进行了备份,又通过 bgsave 命令在 rdb 文件中进行备份,那么在重启 redis 服务器后,它是会加载两个文件中的数据吗???

答案:并不是的,当我们开启了 AOF 后,rdb 文件就不会再使用了,这个文件就相当于是透明的了,接下来的备份操作以及读取数据都是在 aof 文件中进行的。

AOF 的工作流程

Redis 之所以速度很快,最主要的原因是因为:它是操作内存的。

但是,在引入了 AOF 之后,又要写内存,又要写硬盘,那么样不久大大拖慢了速度吗???

实际上,并没有什么太大的影响的,因为,AOF 机制并非是直接让工作线程把数据写入硬盘,而是先写入到一个内存缓冲区中(AOF缓冲区),等到积累的一定量的数据之后,再把缓冲区的数据一次性写入到硬盘中,此时就大大降低了写硬盘的次数,在写硬盘的时候,写入数据的多少对于性能影响没有很大,但是写硬盘的次数则影响很大了!!!

通过上述的讲解,此时就又会出现一个问题,如果把数据写入到内存缓冲区里,本质上还是在内存里呀,如果万一掉电了或者进程挂了,此时数据不久丢失了吗???

答案:是的,这种情况下,数据确实就会丢失。而AOF 机制就给了我们一些选项,也就是缓冲区的刷新策略,让我们根据实际情况对 ”效率“ 和 ”数据的可靠性“ 作一个取舍。

当刷新频率越高时,性能影响就越大,同时数据的可靠性就越高。

刷新频率越低时,性能影响就越小,同时数据可靠性就降低了,数据就容易丢丢失。

就像mysql的隔离级别一样,想要提高隔离性,并发程度就降低了,想要提高并发程度,隔离性就降低了。

此时,就让我想起了苏轼的一句话,人有悲欢离合,月有阴晴圆缺,此事古难全。想要鱼和熊掌兼得,这是不容易的,

AOF 缓冲区策略

AOF 缓冲区的策略是在配置文件中由 appendsync 参数的值控制的,策略值都有以下几个:

aways频率是最高的,数据的可靠性最高,性能最低
everysec频率降低,数据的可靠性减低,性能得到提高
no频率最低,数据的可靠性最低,性能最高

在配置文件中,默认的就是 everysec,如下图:

在这里插入图片描述

AOF 的重写机制

AOF 它的设定是将用户的每次操作都写入到 AOF 中,但是随着 redis 的持续运行,AOF 的文件就会越来越大,体积大了之后,就会影响到 redis 的下次启动时间,因为 redis 启动的时候,就要恢复数据,如果数据太多,就会影响启动时间,这是其一,其二就是 aof 文件中有一些内容是冗余的!!!

举个例子,如下图:

在这里插入图片描述

以上,这三次操作过程就可以转化成一次操作,所以这三次操作过程就是冗余的。

所以,针对 aof 文件过大的问题,就利用了重写机制给 aof 文件进行重写,就可以达到瘦身效果。

重写完的AOF文件为什么可以变小?

首先呢,在 redis 的 aof 文件中,记录的是整个操作过程,例如 lpush key 111 ,但是,redis 在启动的时候,并不关注这些过程,只是关注这些结果,也就是内存中都有哪些数据。

所以,就对 aof 文件进行整理 ,这个整理是能够剔除其中的冗余操作,并且合并一些操作,达到给 aof 文件瘦身这样的效果。就相当于中间的过程能去掉就去掉,只保留结果即可。

而且,在旧的 aof 文件中,也可能会存在像 del、hdel、srem这样的删除命令,但是经过这样的命令之后,数据都被删除了,而在aof文件中保留的这些删除操作也没啥用,所以也要进行清除掉,所以,重写完的 aof 文件就会变小。

AOF 重写流程

AOF 的重写也是分为以下两种:

① 手动触发:调用 bgrewriteaof 命令

② 自动触发:在配置文件中,根据 auto-aof-rewrite-min-size 和 auto-aof-rewrite-percentage 参数确定自动触发时机。

  • auto-aof-rewrite-min-size :表示当文件达到多大时,就触发重写操作,默认位 64MB
  • auto-aof-rewrite-percentage:表示当前 AOF 文件的大小相比较上次重写时的比例,比如,指定了这个比例是 50%,如果上次重写是的文件大小是 0.5g,当前文件大小是 1g,此时就会触发自动重写。

重写流程如下:

① 父进程通过fork创建出子进程,此时,父进程仍然负责接收客户端请求,子进程负责针对 aof 文件进行重写。

那么,这个重写是具体是如何重写的呢???

其实,重写的时候,并不关心 aof 文件中原来都有啥,只是关心内存中最终的数据状态,所以,在进行重写时,并不需要再去遍历旧的 aof 文件,把最终结果整理出来,因为,我们只需要获取到最终的数据即可,而最终的数据现在也就是在内存中保存着的呀,所以,子进程只需要把内存中当前的数据,获取出来,以 AOF 的格式写入到新的 aof 文件中即可。

此处的子进程写数据的过程,非常类似于 RDB 生成一个快照文件,只不过,RDB 这里是按照二进制的方式生成的,AOF 重写,则是按照 AOF 这里要求的文本格式来生成的。

② 子进程在重写的过程中呢,父进程也还仍然在不停的接收客户端发来的请求,此时,父进程还是会把这些请求产生的 AOF 数据先写入到“缓冲区”中,再刷新到旧的 AOF 文件中。

而且要注意,在创建子进程的一瞬间,它就相当于继承了当前父进程的内存状态,也就是当前父进程的内存中有啥,子进程的内存中就有啥(这里看起来父进程和子进程好像是同一块内存空间,其实是不同的内存空间,子进程是对父进程的内存空间进行了拷贝,只不过是按照写实拷贝的方式进行的)而子进程中只是包含了 fork 之前的内存数据,而 fork 之后,新来的请求对内存造成的修改,子进程是感知不到的。

③ 但是此时,父进程这里有准备了一个 aof_rewrite_buf,这里就会专门放 fork 之后收到的数据,所以,在 fork 之后,父进程不仅要向 aof_buf 缓冲区中写入数据,还要向 aof_rewrite_buf 缓冲区中写数据。aof_buf 缓冲区主要还是为了往旧的 aof 文件中写数据,而 aof_rewrite_buf 主要是为了后续往新的 aof 文件中写数据,等到子进程这边把数据重写完之后,就会通过“信号”通知一下父进程,父进程再把 aof_rewrite_buf 缓冲区中的数据也写入到新的 aof 文件中。这也就意味着,新的 aof 文件中的数据主要来自两方面,一个是 fork 之前的数据,一个是 fork之后的数据,等到父进程这里也写完之后,就可以用新的 aof 文件代替旧的 aof 文件了。

如果在执行 bgrewriteaof 的时候,当前的 redis 已经正在进行 aof 重写了,会怎么样呢???

也就是上一个重写操作还没完成,此时,就又来了个 bgrewriteaof 命令,此时,父进程会进行一个判定,如果此时正在重写,就不会再次执行 bgrewriteaof 命令了。

如果在执行 bgrewriteaof 的时候,发现当前 redis 在生成 rdb 快照文件时,会怎么样???

此时,aof 重写操作会等待,等到 rdb 快照生成完毕之后,再进行重写。

因为最后都是要写入到新的 aof 文件中,并且,新的 aof 文件最后也会替代旧的 aof 文件,那么,在fork之后,写入数据时,为啥还要再将数据写入到旧的 aof 文件中呢。不写旧的aof文件,直接将数据都交给子进程写新的aof文件不行吗???

为最后都是要写入到新的 aof 文件中,并且,新的 aof 文件最后也会替代旧的 aof 文件,那么,在fork之后,写入数据时,为啥还要再将数据写入到旧的 aof 文件中呢。不写旧的aof文件,直接将数据都交给子进程写新的aof文件不行吗???

答案是:不行,如果出现一种极端的情况,比如,子进程在重写的过程中,重写了一半了,服务器挂了,显然这样的重写就断了,子进程内存中的数据就丢失了,新的 aof 文件内容还不完整,此时,并且缓冲区中的数据也会烟消云散了,那么如果没有写旧的aof文件,那就凉凉喽~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/46935.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

问题:4、商业保险与政策性保险的主要不同之处是:经营主体不同、经营目标不同、承保机制不同。 #学习方法#其他#学习方法

问题:4、商业保险与政策性保险的主要不同之处是:经营主体不同、经营目标不同、承保机制不同。 参考答案如图所示

Linux云计算 |【第一阶段】ENGINEER-DAY3

主要内容: LVM逻辑卷管理、VDO、RAID磁盘阵列、进程管理 一、新建逻辑卷 1、什么是逻辑卷 逻辑卷(Logical Volume)是逻辑卷管理(Logical Volume Management,LVM)系统中的一个概念。LVM是一种用于磁盘管理…

【人工智能】机器学习 -- 贝叶斯分类器

目录 一、使用Python开发工具,运行对iris数据进行分类的例子程序NaiveBayes.py,熟悉sklearn机器实习开源库。 1. NaiveBayes.py 2. 运行结果 二、登录https://archive-beta.ics.uci.edu/ 三、使用sklearn机器学习开源库,使用贝叶斯分类器…

[React 进阶系列] useSyncExternalStore hook

[React 进阶系列] useSyncExternalStore hook 前情提要,包括 yup 的实现在这里:yup 基础使用以及 jest 测试 简单的提一下,需要实现的功能是: yup schema 需要访问外部的 storage外部的 storage 是可变的React 内部也需要访问同…

产品经理-工作中5大类技术名词解析(19)

在产品经理与开发的团队协作中,如果自己知道一些专业术语,对业务的开展是有帮助的,很多时候,在沟通过程当中,就是因为自己不懂,所以才不知道怎么去做,想要什么样的结果 在力所能及的情况下,平时,多了解一些专业术语,是有好处的 数据结构 数据结构是技术人员将数据进…

【iOS】static、extern、const、auto关键字以及联合使用

目录 前言extern关键字static关键字const关键字 联合使用static和externstatic和constextern和const auto关键字 先了解一下静态变量所在的全局/静态区的特点:【iOS】内存五大分区 前言 上面提到的全局/静态区中存放的是全局变量或静态变量: 全局变量…

人工智能大模型发展的新形势及其省思

作者简介 肖仰华,复旦大学计算机科学技术学院教授、博导,上海市数据科学重点实验室主任。研究方向为知识图谱、知识工程、大数据管理与挖掘。主要著作有《图对称性理论及其在数据管理中的应用》、《知识图谱:概念与技术》(合著&a…

C++基础语法:STL之容器(5)--序列容器中的list(二)

前言 "打牢基础,万事不愁" .C的基础语法的学习 引入 序列容器的学习.以<C Prime Plus> 6th Edition(以下称"本书")内容理解 本书中容器内容不多只有几页.最好是有数据结构方面的知识积累,如果没有在学的同时补上 接上一篇C基础语法:STL之容器…

excel系列(三) - 利用 easyexcel 快速实现 excel 文件导入导出

一、介绍 在上篇文章中&#xff0c;我们介绍了 easypoi 工具实现 excel 文件的导入导出。 本篇我们继续深入介绍另一款更优秀的 excel 工具库&#xff1a;easyexcel 。 二、easyexcel easyexcel 是阿里巴巴开源的一款 excel 解析工具&#xff0c;底层逻辑也是基于 apache p…

HTTPS 的加密过程 详解

HTTP 由于是明文传输&#xff0c;所以安全上存在以下三个风险&#xff1a; 窃听风险&#xff0c;比如通信链路上可以获取通信内容。篡改风险&#xff0c;比如通信内容被篡改。冒充风险&#xff0c;比如冒充网站。 HTTPS 在 HTTP 与 TCP 层之间加入了 SSL/TLS 协议&#xff0c…

Spring Cloud LoadBalanced

负载均衡(Load Balance&#xff0c;简称 LB) 是⾼并发, ⾼可⽤系统必不可少的关键组件. 当服务流量增⼤时, 通常会采⽤增加机器的⽅式进⾏扩容, 负载均衡就是⽤来在多个机器或者其他资源中, 按照⼀定的规则合理分配负载. 负载均衡的⼀些实现 就像是eureka中对请求进行轮询的…

Java对象创建过程的解析

Java对象创建过程的解析 1. 类的加载与连接2. 内存分配2.1 分配方式2.2 本地线程缓冲分配&#xff08;TLAB&#xff09; 3. 初始化内存4. 设置对象头 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 对象的创建是一个涉及多个步骤的复杂过程…

Qt:26.Qt项目:贪吃蛇游戏

一、项目功能演示&#xff1a; 开始界面可以点击进入游戏。 点击进入游戏之后&#xff0c;切换到选项界面&#xff0c;该界面可以选择游戏难度&#xff0c;回退&#xff0c;以及查询最近一次游戏得分。 游戏具体界面如下。贴图啥的可以自己换&#xff0c;本人审美不咋行&#x…

[SUCTF 2019]EasySQL1

这是一个简单的SQL注入题&#xff0c;但是因为我的SQL基础约等于0&#xff0c;所以做起来很难。 首先试试引号是否被过滤 可以看到单引号、双引号都被过滤了&#xff0c;试试其他的盲注都不行&#xff0c;基本上可以确定不能用这种方法。 在测试的过程中发现&#xff0c;输入…

RICHTEK立锜科技 WIFI 7电源参考设计

什么是WIFI 7? WiFi 7&#xff08;Wi-Fi 7&#xff09;是下一代Wi-Fi标准&#xff0c;对应的是IEEE 802.11将发布新的修订标准IEEE 802.11be –极高吞吐量EHT&#xff08;Extremely High Throughput &#xff09;。Wi-Fi 7是在Wi-Fi 6的基础上引入了320MHz带宽、4096-QAM、Mu…

oceanbase架构、功能模块、数据存储、特性、sql流转层等概念详解

一、架构图 OceanBase 数据库采用无共享&#xff08;Shared-Nothing&#xff09;分布式集群架构&#xff0c;各个节点之间完全对等&#xff0c;每个节点都有自己的 SQL 引擎、存储引擎、事务引擎&#xff0c;运行在普通 PC 服务器组成的集群之上&#xff0c;具备高可扩展性、高…

【LabVIEW作业篇 - 4】:属性节点赋值和直接节点赋值的区别体现

文章目录 属性节点赋值和直接节点赋值的区别体现 属性节点赋值和直接节点赋值的区别体现 创建5个圆形指示灯&#xff0c;然后循环点亮&#xff0c;先给圆形指示灯赋值假变量&#xff0c;然后再进行循环。 运行结果&#xff0c;观察结果&#xff0c;发现刚开始运行时&#xff0…

引领小模型潮流!OpenAI发布功能强大且成本低的GPT-4o mini

GPT-4o mini的成本比GPT-3.5 Turbo低了超过60%&#xff0c;其聊天表现优于Google的Gemini Flash和Anthropic的Claude Haiku。该模型从周四开始对ChatGPT的免费用户、ChatGPT Plus用户和团队订阅用户开放&#xff0c;并将在下周向企业用户开放。OpenAI计划未来将图像、视频和音频…

【Leetcode】一、排序

文章目录 1、选择排序2、冒泡排序3、插入排序 1、选择排序 给定数组arr&#xff0c;其长度为n。实现思路&#xff1a; 遍历数组&#xff0c;从0 ~ n - 1&#xff0c;找到最小的&#xff0c;找到后&#xff0c;和数组的第一个元素互换位置继续新一轮遍历&#xff0c;从1 ~ n -…

路网双线合并单线——ArcGIS 解决方法

路网双线合并成单线是一个在地图制作、交通规划以及GIS分析中常见的需求。双线路网定义&#xff1a;具有不同流向、不同平面结构的道路。此外&#xff0c;车道数较多的道路&#xff08;例如&#xff0c;双黄实线车道数大于4的道路&#xff09;也可以视为双线路网&#xff0c;本…