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文件

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Day32力扣打卡

打卡记录 买卖股票的最佳时机 IV(状态机DP) 链接 class Solution:def maxProfit(self, k: int, prices: List[int]) -> int:n len(prices)max lambda x, y: x if x > y else yf [[-0x3f3f3f3f] * 2 for _ in range(k 2)]for i in range(k 2…

Vim 从何而来?

Vim 编辑器的创造者、维护者和终身领导者 Bram Moolenaar 为了纪念这位杰出的荷兰程序员,我们今天来聊一聊 Vim 的历史。 Vim 无处不在。它被很多人使用。同时 Vim 可能是世界上 “最难用的软件之一” ,但是又多次被程序员们评价为 最受欢迎的 代码编辑…

设计模式—结构型模式之外观模式(门面模式)

设计模式—结构型模式之外观模式(门面模式) 外观(Facade)模式又叫作门面模式,是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。 例子 我们的电脑会有很多 组件&am…

搜维尔科技:业内普遍选择Varjo头显作为医疗VR/AR/XR解决方案

Varjo 的人眼分辨率混合现实和虚拟现实头显将医疗专业人员的注意力和情感投入提升到更高水平。借助逼真的 XR/VR,医疗和保健人员可以为最具挑战性的现实场景做好准备! 在虚拟、增强和混合现实中进行最高水平的训练和表现 以逼真的 3D 方式可视化医疗数据…

JS原生-弹框+阿里巴巴矢量图

效果&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content&q…

遵循开源软件安全路线图

毫无疑问&#xff0c;开源软件对于满足联邦任务所需的开发和创新至关重要&#xff0c;因此其安全性至关重要。 OSS&#xff08;运营支持系统&#xff09; 支持联邦政府内的每个关键基础设施部门。 联邦政府认识到这一点&#xff0c;并正在采取措施优先考虑 OSS 安全&#xff…

Python框架篇(2):FastApi-参数接收和验证

提示: 如果想获取文章中具体的代码信息&#xff0c;可在微信搜索【猿码记】回复 【fastapi】即可。 1.参数接收 1.1 路径参数(不推荐) 1.代码清单 在app/router下&#xff0c;新增demo_router.py文件,内容如下: from fastapi import APIRouterrouter APIRouter( prefix&qu…

ubuntu 23.04从源码编译安装rocm运行tensorflow-rocm

因为ubuntu22.04的RDP不支持声音转发&#xff0c;所以下载了ubuntu23.04.但官方的rocm二进制包最高只支持ubuntu22.04&#xff0c;不支持ubuntu 23.04&#xff0c;只能自己从源码编译虽然有网友告诉我可以用docker运行rocm。但是我已经研究了好几天&#xff0c;沉没成本太多&am…

SPASS-参数估计与假设检验

参数估计 点估计 点估计用样本统计量的值直接作为总体参数的估计值。如用样本均值直接作为总体均值的估计值,用样本方差直接作为总体方差的估计值等。 常用的点估计法 (1)矩估计法 (2)极大似然估计法 (3)稳健估计法 区间估计 因为点估计直接用样本估计值作为总体参数…

【python基础】用户输入和while循环详解

文章目录 一. 函数input()的工作原理1. 编写清晰的程序2. 使用int()来获取数值输入3. 求模运算符 二. while循环简介1. 使用while循环2. 让用户选择何时退出3. 使用标志4. 使用break退出循环5. 在循环中使用continue 三. 使用while循环处理列表和字典1. 在列表之间移动元素2. 删…

持续集成指南:GitHubAction 自动构建+部署AspNetCore项目

前言 之前研究了使用 GitHub Action 自动构建和发布 nuget 包&#xff1a;开发现代化的.NetCore控制台程序&#xff1a;(4)使用GithubAction自动构建以及发布nuget包 现在更进一步&#xff0c;使用 GitHub Action 在其提供的 runner 里构建 docker 镜像&#xff0c;之后提交到阿…

32位单片机PY32F040,主频72M,外设丰富,支持断码LCD

PY32F040 系列微控制器采用高性能的 32 位 ARM Cortex-M0 内核,宽电压工作范围的 MCU。嵌入高达 128 Kbytes flash 和 16 Kbytes SRAM 存储器,最高工作频率 72 MHz。LQFP64封装两块出头就可以拿到&#xff0c;我们还有开发板和开发资料帮助客户更好的开发。 PY32F040 系列微控…

Python集成学习和随机森林算法

大家好&#xff0c;机器学习模型已经成为多个行业决策过程中的重要组成部分&#xff0c;然而在处理嘈杂或多样化的数据集时&#xff0c;它们往往会遇到困难&#xff0c;这就是集成学习&#xff08;Ensemble Learning&#xff09;发挥作用的地方。 本文将揭示集成学习的奥秘&am…

Rust开发——使用rust实现Redis中hset

一、Redis中hset HSET 是 Redis 中用于在哈希数据结构中设置指定字段的值的命令。哈希是一种类似于字典或映射的数据结构&#xff0c;它存储了键值对的集合&#xff0c;其中每个键都包含多个字段和与这些字段相关联的值。 哈希表在 Redis 中以键值对形式存储&#xff0c;并通…

【libGDX】ApplicationAdapter生命周期

1 前言 libGDX 中&#xff0c;用户自定义的渲染窗口需要继承 ApplicationAdapter 类&#xff0c;ApplicationAdapter 实现了 ApplicationListener 接口&#xff0c;但实现的方法都是空方法&#xff0c;方法释义如下。 public interface ApplicationListener {// 应用首次创建时…

java版工程管理系统Spring Cloud+Spring Boot+Mybatis实现工程管理系统源码

工程项目管理软件&#xff08;工程项目管理系统&#xff09;对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营&#xff0c;全过程、全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一、系统管理 1、数据字典&am…

ArmV8常用汇编指令2

接上文&#xff0c;我们来分析一些具体指令。 1.加载存储指令 Load/Store可以分为立即数、寄存器等操作&#xff0c;格式如下&#xff1a; 这里Rn和Rt均为4位&#xff0c;原因在于&#xff0c;A32/T32是16个通用寄存器。因此使用4bit刚好可以遍历所有。如果是运行在AArch64&a…

Spring Task使用介绍

文章目录 Spring Task介绍cron表达式入门案例Spring Task使用步骤全注解的方式代码开发测试结果 代码仓库 Spring Task 介绍 Spring Task 是Spring框架提供的任务调度工具&#xff0c;可以按照约定的时间自动执行某个代码逻辑。 定位定时任务框架 作用定时自动执行某段Java…

python爬虫概述及简单实践:获取豆瓣电影排行榜

目录 前言 Python爬虫概述 简单实践 - 获取豆瓣电影排行榜 1. 分析目标网页 2. 获取页面内容 3. 解析页面 4. 数据存储 5. 使用代理IP 总结 前言 Python爬虫是指通过程序自动化地对互联网上的信息进行抓取和分析的一种技术。Python作为一门易于学习且强大的编程语言&…

Ps:锁定图层

使用“图层”面板上的锁定图层 Lock Layer功能可以完全或部分锁定图层以保护其内容。 比如&#xff0c;在完成某个图层后希望它不再被修改&#xff08;包括不透明度和图层样式等&#xff09;&#xff0c;可将其完全锁定。 如果不想更改图像&#xff0c;但对其摆放位置还在犹豫不…