谈谈 AOF

news2024/11/19 0:39:59

谈谈 AOF
Append Only File,只追加文件。
AOF 文件存储的是具体的操作命令。
Redis 每执行一条写操作命令,执行完之后,就把该命令追加到 AOF_Buffer 缓冲区中,然后会使用某种写回策略,写回磁盘的AOF文件中。
Redis 重启之后,通过一个伪客户端将 AOF 文件中的命令,发送给 Redis 执行,不就恢复数据了吗?
在这里插入图片描述

为什么先执行完命令之后,再写入 AOF 文件呢?有啥好处?

第一个好处,避免额外的检查开销。
因为如果先将写操作命令记录到 AOF 日志里,再执行该命令的话,如果当前的命令语法有问题,那么如果不进行命令语法检查,该错误的命令记录到 AOF 日志里后,Redis 在使用日志恢复数据时,就可能会出错。
而如果先执行写操作命令再记录日志的话,只有在该命令执行成功后,才将命令记录到 AOF 日志里,这样就不用额外的检查开销,保证记录在 AOF 日志里的命令都是可执行并且正确的。
第二个好处,不会阻塞当前写操作命令的执行,因为当写操作命令执行成功后,才会将命令记录到 AOF 日志。

Redis将 AOF_Buffer中的数据,写回磁盘的策略?

在这里插入图片描述

Redis 提供了 3 种写回硬盘的策略,控制的就是上面说的第三步的过程。
在 redis.conf 配置文件中的 appendfsync 配置项可以有以下 3 种参数可填:
● Always,它的意思是每次写操作命令执行完后,同步将 AOF 日志数据写回硬盘;【性能太差了】
● Everysec,它的意思是每次写操作命令执行完后,先将命令写入到 AOF 文件的内核缓冲区,然后每隔一秒将缓冲区里的内容写回到硬盘;【企业中实际使用最多的】【最多丢1s的数据】
● No,每次写操作命令执行完后,先将命令写入到 AOF 文件的内核缓冲区,再由操作系统决定何时将缓冲区内容写回硬盘。【数据不安全】

AOF 重写机制

随着写操作命令不断的追加写入 AOF 文件,AOF 文件的大小会越来越大。
如果当 AOF 日志文件过大就会带来性能问题,比如重启 Redis 后,需要读 AOF 文件的内容以恢复数据,如果文件过大,整个恢复的过程就会很慢。
所以,Redis 为了避免 AOF 文件越写越大,提供了 AOF 重写机制,当 AOF 文件的大小超过所设定的阈值后,Redis 就会启用 AOF 重写机制,来压缩 AOF 文件。
所以,重写机制的妙处在于,尽管某个键值对被多条写命令反复修改,最终也只需要根据这个「键值对」当前的最新状态,然后用一条命令去记录键值对,代替之前记录这个键值对的多条命令,这样就减少了 AOF 文件中的命令数量。最后在重写工作完成后,将新的 AOF 文件覆盖现有的 AOF 文件。【扫描 Redis 数据库中所有键值对,然后为每一个键值对生成一条对应的写操作命令,再将命令记录到新的 AOF 文件中】
这里说一下为什么重写 AOF 的时候,不直接复用现有的 AOF 文件,而是先写到新的 AOF 文件再覆盖过去。
因为如果 AOF 重写过程中失败了,现有的 AOF 文件就会造成污染,可能无法用于恢复使用。
所以 AOF 重写过程,先重写到新的 AOF 文件,重写失败的话,就直接删除这个文件就好,不会对现有的 AOF 文件造成影响。

重写 AOF 过程是由子进程来完成的,在重写过程中,如果又有新的写操作命令,那么新重写的AOF文件中的数据就与Redis内存中的数据不一致了,怎么办?

子进程执行 AOF 重写期间,主进程需要执行以下三个工作:
● 执行客户端发来的命令;
● 将执行后的写命令追加到 「AOF 缓冲区」;
● 将执行后的写命令追加到 「AOF 重写缓冲区」;
子进程重写完之后,发一个信号给主进程,告诉主进程我重写好了,主进程收到信号后,会将 AOF 重写缓冲区中的命令追加到新重写的 AOF 文件中(会阻塞主进程),然后将新的 AOF 文件改名,覆盖旧的 AOF 文件。
在整个 AOF 后台重写过程中,除了fork 主进程,发生写时复制会对主进程造成阻塞,还有信号处理函数执行时也会对主进程造成阻塞,在其他时候,AOF 后台重写都不会阻塞主进程。

Redis重启恢复数据的时候,优先加载AOF文件,因为AOF文件更能保证数据的完整性。
在 Redis 恢复数据时, RDB 恢复数据的效率会比 AOF 高,因为直接将 RDB 文件读入内存就可以,不需要像 AOF 那样还需要额外执行操作命令的步骤才能恢复数据。
用 AOF 日志的方式来恢复数据其实是很慢的,因为 Redis 执行命令由单线程负责的,而 AOF 日志恢复数据的方式是顺序执行日志里的每一条命令,如果 AOF 日志很大,这个「重放」的过程就会很慢了

重写AOF的时候,如果有 bgsave 命令,是不会执行的。
所以说,不要在业务繁忙的时候,进行AOF文件的重写。

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

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

相关文章

【GD32】GD32F303串口设置DMA发生中断无法进入中断函数

在GD32F303官方提供的串口例程中,有一个DMA发生和接收中断例程,在模仿着写的过程中,能够正常发送数据,但是无法进入中断函数。DMA0_Channel3_IRQHandler函数时官方定义的弱函数,需要自己重新实现。如果开启了DMA0通道3…

ESP32单片机环境搭建(VScode + PlatformIO IDE)

一、环境搭建(VScode PlatformIO IDE) 1、官网下载VScode; 2、安装最新的插件(C/C、PlatformIO IDE、python、Chinese); 3、在PlatformIO IDE中新建工程:Platforms——Projects——Create New Project——…

微信小程序-3

一、交互 API - - - 界面 - - - 交互 功能&#xff1a;提示 是否删除 1.wx.showToast 显示消息提示框 <button type"primary" bindtapclickBtn>按钮</button> <input style"margin: 20rpx;height: 60rpx;background: gainsboro;" type&…

百度文心一言 VS GPT

更多精华&#xff1a;即兴小索奇 | Link3 相信大家都关注AI&#xff0c;AI大模型已成为了科技领域的新焦点&#xff0c;各大科技巨头都争相推出自家的版本。其中&#xff0c;尤为引人注目的是中国科技巨头百度所推出的文心大模型。然而&#xff0c;即使在这激烈的竞争中&#x…

【数据结构与算法】字符串匹配,BF算法和KMP算法,next数组求法

朴素的模式匹配算法 bf算法 假设在主串S"helloworld"中找T"hellr"这个子串的位置 实现的思路如下 第一轮&#xff1a;子串中的第一个字符和主串中的第一个字符进行比较 如果相等&#xff0c;继续比较主串和子串中的第二个字符如果不相等&#xff0c;进行…

解决vue3 + vite + ts 中require失效的问题(require is not defind)

require is not defind因为require是属于webpack的方法&#xff0c;vite中找不到这个方法肯定报错 解决办法 通过vite官网了解到新的引入方式&#xff0c;我使用了其中一种 imgList: [{name: "lj",src: new URL(../../assets/img/applyList.png, import.meta.url).…

大数据 DataX 数据同步数据分析入门

目录 一、DataX 概览 1.1 DataX 是什么 1.2 DataX 3.0 概览 设计理念 当前使用现状 二、DataX 详解 2.1 DataX 3.0 框架设计 2.2 DataX 3.0 插件体系 2.3 DataX 3.0 核心架构 2.3.1 核心模块介绍 2.3.2 DataX 调度流程 2.4 DataX 3.0 的六大核心优势 2.4.1 可靠的…

为Mkdocs添加在线聊天(Tidio为例)

以Tidio为例,Tidio免费版已经完全够用且无需梯子 访问Tidio官网 要在您的网站上使用 javascript 代码方法安装 Tidio&#xff0c;您需要创建一个 Tidio 帐户。要创建 Tidio 帐户&#xff0c;请访问我们的网站<www.tidio.com>&#xff0c;然后单击 “开始” 按钮创建新的…

代码随想录算法训练营第23期day24|回溯算法理论基础、77. 组合

目录 一、回溯算法基础 回溯法模板 二、&#xff08;leetcode 77&#xff09;组合 剪枝 一、回溯算法基础 1.回溯的本质是穷举&#xff0c;穷举所有可能&#xff0c;然后选出想要的答案&#xff08;为了提升效率&#xff0c;最多再加一个剪枝&#xff09; 2.回溯法解决的…

第五章 运输层 | 计算机网络(谢希仁 第八版)

文章目录 第五章 运输层5.1 运输层协议概述5.1.1 进程之间的通信5.1.2 运输层的两个主要协议5.1.3 运输层的端口 5.2 用户数据报协议UDP5.2.1 UDP概述5.2.2 UDP的首部格式 5.3 传输控制协议TCP概述5.3.1 TCP最主要的特点5.3.2 TCP的连接 5.4 可靠传输的工作原理5.4.1 停止等待协…

SpringMVC源码分析(三)HandlerExceptionResolver启动和异常处理源码分析

问题&#xff1a;异常处理器在SpringMVC中是如何进行初始化以及使用的&#xff1f; Spring MVC提供处理异常的方式主要分为两种&#xff1a; 1、实现HandlerExceptionResolver方式&#xff08;HandlerExceptionResolver是一个接口&#xff0c;在SpringMVC有一些默认的实现也可以…

(ubuntu) 安装JDK

文章目录 前言参看java版本的命令&#xff1a;安装jdk命令安装jps关闭防火墙&#xff1a;查看端口占用&#xff1a;&#xff08;坑&#xff09;ubuntu上Mysql默认标明 区分大小写 前言 提示&#xff1a;常以为人是一个容器&#xff0c;盛着快乐&#xff0c;盛着悲哀。但是人不…

JUC并发编程——线程池学习:基础概念及三大方法、七大参数、四大拒绝策略(基于狂神说的学习笔记)

线程池 池化技术的本质&#xff1a;事先准备好一些资源&#xff0c;线程复用&#xff0c;用完即还&#xff0c;方便管理 默认大小&#xff1a;2 最大并发数max 根据电脑去设置&#xff0c;CPU密集型&#xff0c;IO密集型 线程池的好处&#xff1a; 降低资源的消耗提高响应的…

【马蹄集】—— 概率论专题

概率论专题 目录 MT2226 抽奖概率MT2227 饿饿&#xff01;饭饭&#xff01;MT2228 甜甜花的研究MT2229 赌石MT2230 square MT2226 抽奖概率 难度&#xff1a;黄金    时间限制&#xff1a;1秒    占用内存&#xff1a;128M 题目描述 小码哥正在进行抽奖&#xff0c;箱子里有…

双目项目实战---测距(获取三维坐标和深度信息)

目录 1.简介 2.模块讲解 2.1 立体校正 2.1.1 校正目的 2.1.2 校正方法 2.2 立体匹配和视差计算 2.3 深度计算 3.完整代码 1.简介 双目视觉是一种通过两个摄像机&#xff08;或者两个镜头&#xff09;同时拍摄到同一个场景&#xff0c;再通过计算机算法来获取该场景深度…

C++ - 智能指针的定制删除器

前言 在上一篇C 文章当中&#xff0c;对 智能指针的使用&#xff0c;做了很详细的介绍&#xff0c;对 C11 和 C98 库当中实现的一些常用智能指针做了很详细的介绍&#xff0c;但是智能指针的使用还有一些拓展用法。上篇文章链接&#xff1a;C - 智能指针 - auto_ptr - unique_…

Stm32_标准库_16_串口蓝牙模块_手机与蓝牙模块通信_手机传入信息能对芯片时间日期进行更改

实现了手机发送信息给蓝牙模块&#xff0c;程序对数据进行分析拆解&#xff0c;并更新自身数据 main.c: #include "stm32f10x.h" // Device header #include "Delay.h" #include "OLED.h" #include "Serial.h" #include "Ti…

无人驾驶路径规划(一)全局路径规划 - RRT算法原理及实现

前言&#xff1a;由于后续可能要做一些无人驾驶相关的项目和实验&#xff0c;所以这段时间学习一些路径规划算法并自己编写了matlab程序进行仿真。开启这个系列是对自己学习内容的一个总结&#xff0c;也希望能够和优秀的前辈们多学习经验。 一、无人驾驶路径规划 众所周知&a…

Google Authenticator 和gitlab使用的方法配置Google AuthenticatorGoogle

Google Authenticator 和gitlab使用的方法 目录概述需求&#xff1a; 设计思路实现思路分析1.配置过程&#xff1a; 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a bette…

D201126 D201129 支持以太网高级物理层(APL)

D201126 D201129 支持以太网高级物理层(APL) 全球技术和软件领导者艾默生宣布了基于其无限自动化愿景&#xff0c;并作为其下一代以软件为中心的工业自动化架构的基础。新技术的发布将超越传统的控制系统&#xff0c;创建一个更先进的自动化平台&#xff0c;为人类和塑造世界…