AOF是什么?

目录

一、AOF是什么?

二、使用AOF

三、命令写入

四、重写机制

4.1 触发AOF

4.2 AOF执行流程


一、AOF是什么?

AOF是Append Only File,是Redis中实现持久化的一种方式。以独⽴⽇志的⽅式记录每次命令,重启时再重新执⾏ AOF ⽂件中的命令达到恢复数据的⽬的。AOF 的主要作⽤是解决了数据持久化的实时性,⽬前已经是 Redis 持久化的主流⽅式。

二、使用AOF

开启 AOF 功能需要设置配置:appendonly yes,默认不开启。AOF ⽂件名通过 appendfilename配置(默认是appendonly.aof)设置。保存⽬录同 RDB 持久化⽅式⼀致,通过 dir 配置指定。AOF 的⼯作流程操作:命令写⼊(append)、⽂件同步(sync)、⽂件重写(rewrite)、重启加载(load),如图所示

配置完之后需要重启Redis,然后就会发现有了aof的文件了

 

  1. AOF的执行方式不是直接将数据写入AOF文件中的,而是将所有的命令数据写入到一个aof_buf的缓冲区中,这个缓冲区是在内存中的。
  2. AOF缓冲区会根据对应的刷新策略向硬盘做同步操作
  3. 随着AOF文件越来越大,需要定期对AOF文件进行重写,达到压缩的目的
  4. 当Redis重启时可以通过加载AOF文件进行数据恢复

三、命令写入

 对Redis执行操作,观察aof文件中存储的都是命令语句,并且是以特殊字符来分隔的

AOF是将用户输入的命令直接追加到缓冲区中的,以特定的字符分隔开。那么为什么要写入缓冲区而不是直接写入AOF文件呢?

数据每次写入AOF文件中是直接同步硬盘的,多次同步硬盘会增加IO次数,但是一次同步的过程中数据量多是不会对性能有很大的影响的。所以就有了这种先将数据写入缓存中,然后再由缓存一次将数据都写入AOF文件中的方式来减少IO的次数。

但是,如果写入缓冲区的数据长时间不同步到AOF文件中的话就会造成数据丢失的风险,所以Redis也提供了多种缓冲区的的同步策略,让用户根据自己的需求做出合理的调整。

  • always:只要命令写入缓冲区就立刻同步到AOF文件中
  • everysec(everysecond):每秒将缓冲区的命令同步一次到AOF文件中(Redis默认)

        

  • no:不执行任何同步策略,由操作系统自行安排

四、重写机制

随着AOF文件中不断有命令写入,文件也会越来越大,为了解决这个问题,Redis引入了AOF重写机制来压缩文件的体积。AOF文件重写就是把Redis进程内的数据转化为写命令同步到新的AOF文件中。为什么重写可以使得AOF文件变小呢?

由于AOF文件中是存储Redis命令的,其中不乏有很多重复的命令,例如以下几种,都是对同一个key进行操作,最后的结果应该是 key = 3333 就行了,但是在AOF文件中存储的却是所有的命令,久而久之肯定就会造成文件空间过度浪费。所以这里就有了重写的机制

4.1 触发AOF

  • bgrewriteaof (手动输命令触发)

           创建一个子线程,在子线程中进行重写,最后将重写的AOF文件替换原有的文件

  • 自动触发

        根据auto-aof-rewrite-min-size和auto-aof-rewrite-percentage参数确定⾃动触发时机。

        auto-aof-rewrite-percentage:代表当前 AOF 占⽤⼤⼩相⽐较上次重写时增加的⽐例

        auto-aof-rewrite-min-size:表⽰触发重写时 AOF 的最⼩⽂件⼤⼩,默认为64MB。

        

4.2 AOF执行流程

AOF的执行流程相比于RDB来说是差不多的,只是多了一个实时性。这里可能有的同学就会问了,既然是一样的那我还要RDB干嘛?并不是所有的场景都需要实时存储,可能有些场景就需要RDB的定时存储。所以特定的场景选用特定的技术才是最合适的

1. 首先执行AOF重写请求,如果当前进程正在执⾏ AOF 重写,请求不执⾏。如果当前进程

    正在执⾏ bgsave 操作,重写命令延迟到 bgsave 完成之后再执⾏

2. 父进程阻塞等待(很快单位以微秒记)执行fork,创建出子进程

3. 重写

        3.1 当父进程fork之后,继续响应其他命令。所有修改操作写⼊ AOF 缓冲区并根据               appendfsync策略同步到硬盘,保证旧 AOF ⽂件机制正确

        3.2 ⼦进程只有 fork 之前的所有内存信息,⽗进程中需要将 fork 之后这段时间的修改

              操作写⼊ AOF 重写缓冲区中

4. ⼦进程根据内存快照,将命令合并到新的 AOF ⽂件中(这里就是压缩后的文件)

5. 子进程完成重写

        5.1 新⽂件写⼊后,⼦进程发送信号给⽗进程

        5.2 父进程将AOF重写缓存区内临时保存的新命令追加到新AOF文件中

        5.3 用新的AOF文件替换旧的的AOF文件

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

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

相关文章

自动驾驶-BEV感知综述

BEV感知综述 随着自动驾驶传感器配置多模态化、多源化,将多源信息在unified View下表达变得更加关键。BEV视角下构建的local map对于多源信息融合及理解更加直观简洁,同时对于后续规划控制模块任务的开展也更为方便。BEV感知的核心问题是: …

飞书开发学习笔记(八)-开发飞书小程序Demo

飞书开发学习笔记(八)-开发飞书小程序Demo 一.小程序开发概述 1.1 小程序开发概述 飞书开发文档中查看:小程序开发概述 飞书小程序是指可以运行在飞书客户端中的小程序,小程序的一套代码可以适配 Android、iOS、PC 多平台,且用户体验与飞书…

VUE基础的一些实战总结

目录 创建一个 Vue 应用 步骤 1:安装 Node.js 和 npm 步骤 2:安装 Vue CLI 步骤 3:创建 Vue 项目 步骤 4:启动开发服务器 步骤 5:访问应用程序 步骤 6:编辑 Vue 应用 步骤 7:构建和部署…

python3.8 安装 ssl 模块 和 _ctypes 模块

这文章目录 前情提要安装 openssl-1.1.1重新编译安装 python3.8-rpath 编译选项介绍python3.8 跟 python3.10 的区别那要怎么解决这个问题呢,我想到有四种解决方案: 前情提要 我在之前给 python3.10 安装 ssl 模块后以为该步骤 “对于 python3.6、pytho…

uniapp使用Canvas实现电子签名

来源: 公司的一个需求,需要给新注册的会员和客商需要增加签署协议功能; 之前的思路: 1、使用vue-signature-pad来实现电子签名,但是安卓手机不兼容; 2、uniapp插件市场来实现,但是对HBuilderX…

【MMC/SD/SDIO】读写操作

SD 总线是基于命令和数据流,它们由一个开始 Bit 发起,由一个停止 Bit 结束。 Command:命令开始一个操作。命令由 Host 驱动,或者给单卡(寻址命令),或者给所有连接的卡(广播命令&…

【Linux网络】工作环境救急——关于yum安装的5个花式操作

目录 1、只下载不安装,离线安装软件 2、自行打包创建元数据 第一步:先准备好nginx的软件包,放在一个文件夹下 第二步:在本地下载createrepo命令软件,用于创建元信息,这个一定是对包的上一级目录使用命令…

【Android】导入三方jar包/系统的framework.jar

1.Android.mk导包 1).jar包位置 与res和src同一级的libs中(没有就新建) 2).Android.mk文件 LOCAL_STATIC_ANDROID_LIBRARIES:android静态库,经常用于一些support的导包 LOCAL_JAVA_LIBRARIES:依赖的java库,一般为系统的jar…

【MySQL学习笔记-001】- 创建表、插入数据、查看数据库结构

创建employees表 当创建一个表时,需要指定表的名称和每个列的名称和数据类型。以下是一个示例SQL语句,用于创建一个名为"employees"的表,其中包含员工ID、姓名、职位和工资等列: CREATE TABLE employees (employee_id…

PCA降维Python demo

读这篇15年CVPR的文章🤣🤣🤣🤣🤣 inproceedings{liu2015sparse,title{Sparse convolutional neural networks},author{Liu, Baoyuan and Wang, Min and Foroosh, Hassan and Tappen, Marshall and Pensky, Marianna},…

相机突然断电,保存的DAT视频文件如何修复

3-7 本文主要解决因相机突然断电导致拍摄的视频文件损坏的问题。 在平常使用相机拍摄视频,比如用单反相机、无人机拍摄视频的时候,如果电池突然断电,或者突然炸机了,就非常有可能会得到一个损坏的视频文件,比如会产生…

【Vue配置项】 computed计算属性 | watch侦听属性

目录 前言 computed计算属性 什么是计算属性? Vue的原有属性是什么? 得到的全新的属性是什么? 计算属性怎么用? 计算属性的作用是什么? 为什么说代码执行率高了? computed计算属性中的this指向 co…

Express.js 与 Nest.js对比

Express.js 与 Nest.js对比 自从 Node.js 发布以来,Javascript 在后端领域的使用有所增加。由于 Node.js 的使用越来越多,每天都会有新的框架和工具发布。Express 和 Nest 是使用 Node.js 创建后端应用程序的最著名的框架之一,在本文中&…

【前段基础入门之】=>CSS3新特性 响应式布局

文章目录 概念媒体查询媒体类型媒体特性媒体运算符 概念 所谓对响应式布局方案的理解,众说纷纭,核心点就是同一套代码在不同尺度屏幕下的布局呈现方式的不同 社区中有很多人分享,并列出了多种实现响应式布局的方案,比如【 rem&…

基于ssm+vue员工工资管理系统

基于ssmvue员工工资管理系统 摘要 随着信息技术的不断发展,各行各业对于高效管理和利用数据的需求也日益增长。员工工资管理系统作为企业管理中的一个重要组成部分,对于实现工资信息的精确计算、及时发放和有效管理具有重要意义。本文基于SSM&#xff08…

消息中间件概述

概述 消息队列已经逐渐成为企业IT系统内部通信的核心手段。它具有低耦合、可靠投递、广播、流量控制、最终一致性等一系列功能,成为异步RPC的主要手段之一。当今市面上有很多主流的消息中间件,如ActiveMQ、RabbitMQ,Kafka,还有阿里…

Word文档处理:用Python轻松提取Word文档图文数据

将内容从Word文档中提取出来可以方便我们对其进行其他操作,如储将内容存在数据库中、将内容导入到其他程序中、用于AI训练以及制作其他文档等。使用Spire.Doc for Python提供了一个简单的方法直接提取Word文档中的文本内容,包括文本和图片,而…

【Linux】重定向|重新理解Linux下一切皆文件

文章目录 一、什么是重定向输出重定向的原理认识一下输出重定向的系统调用输出重定向的另外写法 二、浅谈输入重定向三、重定向和进程替换有冲突吗四、Linux下一切皆文件总结 一、什么是重定向 理解重定向之前:先理解一个叫做文件描述符的具体操作。 文件描述符&a…

【Qt之QWizardPage】使用

介绍 QWizardPage类是向导页面的基类。 QWizard表示一个向导。每个页面都是一个QWizardPage。当创建自己的向导时,可以直接使用QWizardPage,也可以子类化它以获得更多控制。 页面具有以下属性,由QWizard呈现:a title,…

JVM虚拟机-虚拟机执行子系统-第6章 字节码指令

字节码指令 Java虚拟机的指令由一个字节长度的、代表着某种特定操作含义的数字(称为操作码,Opcode)以及跟随其后的零至多个代表此操作所需的参数(称为操作数,Operand)构成。 字节码与数据类型 在Java虚拟…