当前位置: 首页 > news >正文

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文件,那就凉凉喽~~

相关文章:

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

文章目录 缓冲AOF 策略(append only file)AOF 的工作流程AOF 缓冲区策略AOF 的重写机制重写完的AOF文件为什么可以变小?AOF 重写流程 缓冲AOF 策略(append only file) AOF 的核心思路是 “实时备份“,只要我添加了新的数据或者更新了新的数据&#xff0…...

共享模型之无锁

一、问题提出 1.1 需求描述 有如下的需求,需要保证 account.withdraw() 取款方法的线程安全,代码如下: interface Account {// 获取余额Integer getBalance();// 取款void withdraw(Integer amount);/*** 方法内会启动 1000 个线程&#xf…...

下载安装VSCode并添加插件作为仓颉编程入门编辑器

VSCode下载地址:下载 Visual Studio Code - Mac、Linux、Windows 插件下载:GitCode - 全球开发者的开源社区,开源代码托管平台 仓颉社区中下载解压 cangjie.vsix 插件 打开VSCode 按 Ctrl Shift X 弹出下图 按照上图步骤依次点击选中我们下…...

解决:Linux上SVN 1.12版本以上无法直接存储明文密码

问题:今天在Linux机器上安装了SVN,作为客户端使用,首次执行SVN相关操作,输入账号密码信息后,后面再执行SVN相关操作(比如"svn update")还是每次都需要输入密码。 回想以前在首次输入…...

Mongodb多键索引中索引边界的混合

学习mongodb,体会mongodb的每一个使用细节,欢迎阅读威赞的文章。这是威赞发布的第93篇mongodb技术文章,欢迎浏览本专栏威赞发布的其他文章。如果您认为我的文章对您有帮助或者解决您的问题,欢迎在文章下面点个赞,或者关…...

如何利用windows本机调用Linux服务器,以及如何调用jupyter界面远程操控

其实这篇文章没必要存在,教程太多了 参考博客(1 2 3),如侵删 奈何网上的大神总是会漏掉一些凡人遇到的小问题 (1) 建议下载PuTTy for windows,从而建立与远程服务器的SSH连接 需要确认目标服…...

如何定位Milvus性能瓶颈并优化

假设您拥有一台强大的计算机系统或一个应用,用于快速执行各种任务。但是,系统中有一个组件的速度跟不上其他部分,这个性能不佳的组件拉低了系统的整体性能,成为了整个系统的瓶颈。在软件领域中,瓶颈是指整个路径中吞吐…...

阿里云服务器 篇三:提交搜索引擎收录

文章目录 系列文章推荐:为网站注册域名判断网站是否已被搜索引擎收录主动提交搜索引擎收录未查询到收录结果时,根据提示进行提交网站提交网站时一般需要登录账号主动提交网站可缩短爬虫发现网站链接时间,但不保证一定能够收录所提交的网站百度提交地址360搜索提交地址搜狗提…...

powe bi界面认识及矩阵表基本操作 - 1

powe bi界面认识及矩阵表操作 1. 界面认识1.1 选择数据源1.2 选择相关表及点击加载1.3 表字段显示位置1.4 表属性按钮位置1.5 界面布局按钮认识 2. 矩阵表基本操作2.1 选择矩阵表2.2 创建矩阵表2.3 设置字体大小2.4 行填充:修改高度2.5 列宽:设置列的宽度…...

SpringBoot 项目 pom.xml 中 设置 Docker Maven 插件

在Spring Boot项目中,使用Docker Maven插件(通常是docker-maven-plugin或者fabric8io/docker-maven-plugin)来自动化构建Docker镜像并将其推送到远程仓库。 这里分别介绍这两种插件的基本配置,并说明如何设置远程仓库推送。 1、…...

k8s二次开发-kubebuiler一键式生成deployment,svc,ingress

一 Kubebuilder环境搭建 注&#xff1a;必须在当前的K8S集群有 nginx这个ingressclass rootk8s:~# kubectl get ingressclass NAME CONTROLLER PARAMETERS AGE nginx k8s.io/ingress-nginx <none> 19h1.1 下载kubebuilder wget https://gi…...

Flutter 状态管理新境界:多Provider并行驱动UI

前言 在上一篇文章中&#xff0c;我们讨论了如何使用 Provider 在 Flutter 中进行状态管理。 本篇文章我们来讨论如何使用多个 Provider。 在 Flutter 中&#xff0c;使用 Provider 管理多个不同的状态时&#xff0c;你可以为每个状态创建一个单独的 ChangeNotifierProvider…...

标识符和关键字的区别是什么,常用的关键字有哪些?自增自减运算符,移位运算符continue、break、return的区别是什么?

标识符和关键字的区别是什么&#xff0c;常用的关键字有哪些&#xff1f; 标识符标识符就是当我们给变量&#xff0c;方法&#xff0c;类命名时候的名字&#xff0c;而被赋予特殊含义的标识符就是关键字。例如生活中&#xff0c;当我们需要开一家店时候&#xff0c;我们不能将…...

在VS Code上搭建Vue项目教程(Vue-cli 脚手架)

1.前期环境准备 搭建Vue项目使用的是Vue-cli 脚手架。前期环境需要准备Node.js环境&#xff0c;就像Java开发要依赖JDK环境一样。 1.1 Node.js环境配置 1&#xff09;具体安装步骤操作即可&#xff1a; npm 安装教程_如何安装npm-CSDN博客文章浏览阅读836次。本文主要在Win…...

AGI 之 【Hugging Face】 的【零样本和少样本学习】之三 [无标注数据] 的简单整理

AGI 之 【Hugging Face】 的【零样本和少样本学习】之三 [无标注数据] 的简单整理 目录 AGI 之 【Hugging Face】 的【零样本和少样本学习】之三 [无标注数据] 的简单整理 一、简单介绍 二、零样本学习 (Zero-shot Learning) 和少样本学习 (Few-shot Learning) 1、零样本学…...

Docker 和 k8s 之间是什么关系?

Docker 简介 Docker 功能&#xff1a; Docker 是一款可以将程序和环境打包并运行的工具软件。通过 Docker&#xff0c;可以将程序及其依赖环境打包&#xff0c;确保在不同操作系统上一致的运行效果。 环境一致性问题&#xff1a; 程序依赖于特定的环境&#xff0c;不同操作系统…...

敲详细的springframework-amqp-rabbit源码解析

看源码时将RabbitMQ的springframework-amqp-rabbit和spring-rabbit的一套区分开&#xff0c;springboot是基于RabbitMQ的Java客户端建立了简便易用的框架。 springboot的框架下相对更多地使用消费者Consumer和监听器Listener的概念&#xff0c;这两个概念不注意区分容易混淆。…...

Telegram Bot、小程序开发(三)Mini Apps小程序

文章目录 一、Telegram Mini Apps小程序二、小程序启动方式三、小程序开发小程序调试模式初始化小程序Keyboard Button Mini Apps 键盘按钮小程序【依赖具体用户信息场景,推荐】**Inline Button Mini Apps内联按钮小程序**initData 的自动传递使用内联菜单时候哪些参数会默认传…...

Django F()函数

F()函数的作用 F()函数在Django中是一个非常强大的工具&#xff0c;主要用于在查询表达式中引用模型的字段。它允许你在数据库层面执行各种操作&#xff0c;而无需将数据加载到Python内存中。这不仅提高了性能&#xff0c;还允许你利用数据库的优化功能。 字段引用 在查询表达…...

GraphRAG的实践

好久没有体验新技术了&#xff0c;今天来玩一下GraphRAG 顾名思义&#xff0c;一种检索增强的方法&#xff0c;利用图谱来实现RAG 1.配置环境 conda create -n GraphRAG python3.11 conda activate GraphRAG pip install graphrag 2.构建GraphRAG mkdir -p ./ragtest/i…...

自动驾驶三维车道线检测系列—LATR: 3D Lane Detection from Monocular Images with Transformer

文章目录 1. 概述2. 背景介绍3. 方法3.1 整体结构3.2 车道感知查询生成器3.3 动态3D地面位置嵌入3.4 预测头和损失 4. 实验评测4.1 数据集和评估指标4.2 实验设置4.3 主要结果 5. 讨论和总结 1. 概述 3D 车道线检测是自动驾驶中的一个基础但具有挑战性的任务。最近的进展主要依…...

守护动物乐园:视频AI智能监管方案助力动物园安全与秩序管理

一、背景分析 近日&#xff0c;某大熊猫参观基地通报了4位游客在参观时&#xff0c;向大熊猫室外活动场内吐口水的不文明行为。这几位游客的行为违反了入园参观规定并可能对大熊猫造成严重危害&#xff0c;已经被该熊猫基地终身禁止再次进入参观。而在此前&#xff0c;另一熊猫…...

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

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

数据仓库事实表

数据仓库中的三种常见事实表类型&#xff1a;事务事实表、周期快照事实表和累积快照事实表 事务事实表&#xff1a; 事务事实表是记录事务级别数据的事实表。它记录了每个事务发生的具体度量指标&#xff0c;如销售金额、数量等。事务事实表的优势在于能够提供详细的事务级别…...

LeetCode题练习与总结:两数之和Ⅱ-输入有序数组--167

一、题目描述 给你一个下标从 1 开始的整数数组 numbers &#xff0c;该数组已按 非递减顺序排列 &#xff0c;请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] &#xff0c;则 1 < index1 < index…...

在 Java 中,怎样设计一个可扩展且易于维护的微服务架构?

在Java中设计一个可扩展且易于维护的微服务架构&#xff0c;可以考虑以下几个方面&#xff1a; 模块化设计&#xff1a;将应用拆分为多个小的、独立的模块&#xff0c;每个模块负责处理特定的业务逻辑。每个模块可以独立开发、测试和部署&#xff0c;增加或替换模块时不会影响其…...

零基础入门鸿蒙开发 HarmonyOS NEXT星河版开发学习

今天开始带大家零基础入门鸿蒙开发&#xff0c;也就是你没有任何编程基础的情况下就可以跟着石头哥零基础学习鸿蒙开发。 目录 一&#xff0c;为什么要学习鸿蒙 1-1&#xff0c;鸿蒙介绍 1-2&#xff0c;为什么要学习鸿蒙 1-3&#xff0c;鸿蒙各个版本介绍 1-4&#xff0…...

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

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

ceph进程网卡绑定逻辑

main() //如osd进程&#xff0c;是ceph_osd.cc文件的main函数&#xff1b;mon进程&#xff0c;是ceph_mon.cc文件的main函数 -->pick_addresses() // 会读取"cluster_network_interface"和"public_network_interface"这两个配置项来过滤ip ---->fill…...

学习opencv

初步学习可以参考&#xff1a; OpenCV学习之路&#xff08;附加资料分享&#xff09;_opencv资料-CSDN博客 【OpenCV】OpenCV常用函数合集【持续更新】_opencv函数手册-CSDN博客 整体框架可以参考&#xff1a; OpenCV学习指南&#xff1a;从零基础到全面掌握&#xff08;零…...

临沂网站建设哪家更好/自己想做个网站怎么做

在Java中经常会涉及到对象数组的排序问题&#xff0c;那么就涉及到对象之间的比较问题。本文为大家介绍java比较器的使用。java比较器的使用对于一个实现了Comparable接口的对象&#xff0c;该接口只能实现一次。如果在一个集合里面需要使用id排序&#xff0c;而在另外一个集合…...

公司网站制作公司排名/企业品牌营销推广

点击关注公众号&#xff0c;Java干货及时送达授权转自&#xff1a;OSCHINA&#xff0c;作者&#xff1a;局长 原文&#xff1a;https://www.oschina.net/news/135658/db-engines-ranking-202104DB-Engines 4 月份流行度排行已更新&#xff0c;基于 3 月份的整体数据变化。从总榜…...

怎么盗取网站/培训机构招生方案

目录一 开启线程的两种方式#方式一from threading import Threadimport timedef sayhi(name):time.sleep(2)print(%s say hello %name)if name main:tThread(targetsayhi,args(egon,))t.start()print(主线程)方式二from threading import Threadimport timeclass Sayhi(Thread…...

做软件的网站建设/班级优化大师的优点

前言&#xff1a;最近在腾讯云买了台学生机打算搭个博客玩玩&#xff0c;由于空间还在备案中&#xff0c;于是就想着先把环境&#xff08;LNMPphpmyadminwordpress&#xff09;部署好&#xff0c;环境很顺利&#xff0c;但晚上重新连上云服务器敲命令时那延时真是叫一个痛苦啊&…...

wordpress 301定向/如何做好网络营销管理

舵机 舵机是一种位置伺服的驱动器&#xff0c;主要是由外壳、电路板、无核心马达、齿轮与位置检测器所构成。其工作原理是由接收机或者单片机发出信号给舵机&#xff0c;其内部有一个基准电路&#xff0c;产生周期为 20ms&#xff0c;宽度为 1.5ms 的基准信号&#xff0c;将获…...

广州做网站信科建设/网站一键生成

学习Excel技术&#xff0c;关注微信公众号&#xff1a;excelperfect在开始阅读本文前&#xff0c;请先学习下列内容&#xff1a;Excel实战技巧66&#xff1a;创建向导样式的数据输入窗体1Excel实战技巧66&#xff1a;创建向导样式的数据输入窗体2Excel实战技巧66&#xff1a;创…...