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

news2024/12/24 2:22:01

文章目录

  • 缓冲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.coloradmin.cn/o/1936785.html

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

相关文章

价格较低,功能最强?OpenAI 推出 GPT-4o mini,一个更小、更便宜的人工智能模型

OpenAI美东时间周四推出“GPT-4o mini”,入局“小而精”AI模型竞争,称这款新模型是“功能最强、成本偏低的模型”,计划今后整合图像、视频、音频到这个模型中。 OpenAI表示,GPT-4o mini 相较于 OpenAI 目前最先进的 AI 模型更加便…

FairGuard游戏加固入选《嘶吼2024网络安全产业图谱》

2024年7月16日,国内网络安全专业媒体——嘶吼安全产业研究院正式发布《嘶吼2024网络安全产业图谱》(以下简称“产业图谱”)。 本次发布的产业图谱,共涉及七大类别,127个细分领域。全面展现了网络安全产业的构成和重要组成部分,探…

微软发布iOS/安卓正式版Designer应用,AI修图功能助力创意设计

一、Microsoft Designer应用正式上线 AITOP100平台获悉,微软一直致力于为用户提供优质的创意工具,此次推出的Microsoft Designer应用正是其在移动端的重要布局。这款应用已正式上线iOS、Android、Windows和网页版本,满足不同用户的需求。微软…

Stable Diffusion 使用详解(2)---- 图生图原理,操作,参数

目录 背景 图生图原理 基本原理 1. 扩散模型基础 2. 图生图的具体流程 3. 关键技术点 4. 应用实例 CLIP 原理 1.基本概念 2. 核心特点 使用及参数 随机种子 重绘幅度 图像宽高 采样方法 1. DPM(扩散概率模型) 2. SDE(随机微…

大语言模型-检索测评指标

1. MRR (Mean Reciprocal Rank)平均倒数排名: 衡量检索结果排序质量的指标。 计算方式: 对于每个查询,计算被正确检索的文档的最高排名的倒数的平均值,再对所有查询的平均值取均值。 意义: 衡量…

ChatTTS超强的真人AI语音助手下载使用教程

简介 ChatTTS是专门为对话场景设计的文本转语音模型,支持多人同时对话,适用的场景非常丰富,比如LLM助手对话任务,视频配音、声音克隆等。同时支持英文和中文两种语言。最大的模型使用了10万小时以上的中英文数据进行训练&#xf…

【Android】 dp与sp,加冕为王

目录 重要概念 屏幕尺寸 屏幕分辨率 屏幕像素密度 基础知识: ppi pt DPI 的定义和重要性 Android 中的 DPI 级别 px dp(Density Independent Pixels) sp(Scale-independent Pixels) 安卓的dp/dip、sp 虚拟…

设置浏览器网页全屏

在日常笔记本上办公时,由于屏幕较小,为了尽可能多和方便的显示浏览器网页上的内容,可以设置网页全屏的方式,去掉屏幕顶端的网址栏和底端栏,具体设置如下: 以Edge浏览器和Google Chrome浏览器为例&#xff…

如何免费用java c#实现手机在网状态查询

今天分享手机在网状态查询接口,该接口适用的场景非常广泛!首先我们先讲下什么是手机在网状态?简单来说,就是你得手机号是否还在正常使用中,是否能够及时接收和回复信息,是否能够随时接听和拨打电话。如果你…

通过libx246 libfaac转换推送RTMP音视频直播流

一、RTMP简介及rtmplib库: RTMP协议是Real Time Message Protocol(实时信息传输协议)的缩写,它是由Adobe公司提出的一种应用层的协议,用来解决多媒体数据传输流的多路复用(Multiplexing)和分包(packetizing…

C++ :友元类

友元类的概念和使用 (1)将类A声明为B中的friend class后,则A中所有成员函数都成为类B的友元函数了 (2)代码实战:友元类的定义和使用友元类是单向的 (3)友元类是单向的,代码实战验证 互为友元类 (1)2个类可以互为友元类,代码实战…

相同IP地址仿真测试

相同IP地址仿真测试 背景与挑战解决方案技术优势功能特点 背景与挑战 在汽车电子领域,电子控制单元(ECU)的测试是确保其功能性和可靠性的关键步骤。然而,当测试场景涉及多个配置相同IP地址的ECU时,传统的测试方法面临…

GooglePlay 金融品类政策更新(7月17号)

距离上次政策大更新(4月5号)才过去了3个月,Google Play又迎来了一次大更新,不得不说Google Play的要求越来越高了。 我们来梳理一下这次GooglePlay针对金融品类更新了哪些政策: 1.要求提供金融产品和服务的开发者必须注册为组织…

IDEA的常见代码模板的使用

《IDEA破解、配置、使用技巧与实战教程》系列文章目录 第一章 IDEA破解与HelloWorld的实战编写 第二章 IDEA的详细设置 第三章 IDEA的工程与模块管理 第四章 IDEA的常见代码模板的使用 第五章 IDEA中常用的快捷键 第六章 IDEA的断点调试(Debug) 第七章 …

STM32使用SPI向W25Q64存储信息(HAL库)

SPI全双工通信:全双工在时钟脉冲周期的每一个周期内,每当主设备同时发送一个字节的同时,会接受从设备接受一个字节数据,SPI全双工最大的特点就是发送和接受数据同步进行,发送多少数据就要接受多少数据。使用全双工通信…

vst 算法R语言手工实现 | Seurat4 筛选高变基因的算法

1. vst算法描述 (1)为什么需要矫正 image source: https://ouyanglab.com/singlecell/basic.html In this panel, we observe that there is a very strong positive relationship between a gene’s average expression and its observed variance. I…

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

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

逻辑回归(Logistic Regression,LR)

分类和回归是机器学习的两个主要问题。 分类处理的是离散数据回归处理的是连续数据 线性回归:回归 拟合一条线预测函数: 逻辑回归:分类——找到一条线可以将不同类别区分开 虽然称为逻辑回归,但是实际是一种分…

Chromium CI/CD 之Jenkins实用指南2024-在Windows节点上创建任务(九)

1. 引言 在现代软件开发流程中,持续集成(CI)和持续交付(CD)已成为确保代码质量和加速发布周期的关键实践。Jenkins作为一款广泛应用的开源自动化服务器,通过其强大的插件生态系统和灵活的配置选项&#xf…

【第4章】Spring Cloud之Nacos单机模式支持mysql

文章目录 前言一、初始化1. 初始化数据库2. 修改配置文件 二、效果1. 重新启动2. 新增用户 总结 前言 在0.7版本之前,在单机模式时nacos使用嵌入式数据库实现数据的存储,不方便观察数据存储的基本情况。0.7版本增加了支持mysql数据源能力,具…