[Redis#15] 持久化 | AOF | rewrite | aof_buf | 混合持久化

目录

1 使用AOF

流程

问题一:父进程在fork之后继续写旧AOF文件的意义

问题二:执行BGREWRITEAOF时的特殊情况处理

2 命令写入

3 文件同步

4 重写机制

工作流程:

触发条件

混合持久化

持久化 sum


AOF(Append Only File)持久化

AOF持久化机制 以独立日志的方式记录每次写命令,重启时再重新执行AOF文件中的命令达到恢复数据的目的。

AOF的主要作用是解决了数据持久化的 实时性 问题,目前已经是Redis持久化的主流方式。理解掌握好AOF持久化机制对我们兼顾数据安全性和性能非常有帮助。

1 使用AOF

AOF文件是一个文本文件,每次进行的操作都会被记录到这个文本文件中,通过一些特殊符号作为分隔符,来对命令的细节做出区分.

AOF一般默认是关闭状态,我们需要通过修改配置文件来开启AOF功能.重启Redis服务之后生效.

cd ect/redis nano redis.conf

文件名配置:通过appendfilename配置项(默认是appendonly.aof)来指定AOF文件名。

保存目录:与RDB持久化方式一致,通过dir配置指定。

重启后测试结果

可以查看到

流程

AOF重写机制涉及 创建一个子进程 来进行重写工作,而父进程继续处理客户端请求。具体步骤如下:

  • 子进程创建与数据获取
    • 父进程通过fork创建一个子进程。
    • 子进程不关心旧AOF文件内容,仅基于内存中的当前数据状态生成新的AOF文件。
  • 数据写入方式
    • 子进程以文本格式写入新AOF文件,类似于RDB快照生成但使用不同格式。
  • 父子进程协作
    • 父进程继续接收命令,并将这些命令 写入缓冲区以及旧的AOF文件中,确保即使重写失败也能保持数据完整性。
    • 在子进程完成新AOF文件的写入后,它会通知父进程。父进程随后将自fork以来收到的新命令从 aof_rewrite_buf缓冲区追加到新AOF文件中,然后替换旧文件。
问题一:父进程在fork之后继续写旧AOF文件的意义

问题描述:
在Redis中进行AOF(Append Only File)文件重写时,父进程在fork子进程之后,子进程开始写入新的AOF文件。随着时间推移,子进程很快会完成新AOF文件的写入。此时,父进程继续写入即将被替换的旧AOF文件是否还有必要?
回答:
有必要。我们需要考虑 极端情况,比如在AOF文件重写过程中,如果子进程或服务器意外挂掉,子进程的内存数据将丢失,导致新的AOF文件不完整。因此,父进程会继续写入旧的AOF文件,以确保数据的安全性。

问题二:执行BGREWRITEAOF时的特殊情况处理

问题描述:

  • 如果在执行BGREWRITEAOF命令时,Redis已经在进行AOF重写,会发生什么?
  • 如果在执行BGREWRITEAOF命令时,Redis正在生成RDB快照文件,会发生什么?

回答:

  • 如果Redis已经在进行AOF重写,那么执行BGREWRITEAOF命令时,不会再次进行AOF重写,系统会直接返回。
  • 如果Redis正在生成RDB快照文件,执行BGREWRITEAOF命令时,AOF重写操作会等待,直到RDB快照生成完成后,再进行AOF重写。

优先级
如果Redis上同时存在AOF文件和RDB快照的时候,此时以AOF文件为主,RDB直接被忽略.

过程复述:

在子进程创建时,它继承了父进程当前的内存状态,但不知道fork之后的新请求对内存的修改。为此,父进程准备了一个aof_rewrite_buf缓冲区,用于存储fork之后接收到的数据。子进程完成AOF数据写入后,会通过信号通知父进程,父进程再将aof_rewrite_buf缓冲区的内容写入新的AOF文件中,之后新的AOF文件就可以替代旧的AOF文件了。


2 命令写入

AOF命令写入的内容直接为文本协议格式。例如set hello world这条命令,在AOF缓冲区会追加如下文本:

*3\r\n$3\r\nset\r\n$5\r\nhello\r\n$5\r\nworld\r\n

Redis选择文本协议的原因包括兼容性、实现简单和具备可读性。使用aof_buf这个缓冲区, 使AOF机制在备份数据的时候, 不是直接让工作线程写入硬盘,而是先写入一个内存中的缓存区,积累一波之后,再统一写入硬盘.可以有效减少IO次数,并允许用户根据需求选择不同的同步策略,从而在性能和安全性之间做出平衡。


3 文件同步

AOF每次把新的操作写入到原有文件的末尾,属于顺序写入.而顺序写入的速度是比较快的.正是由于上面的两点,使得AOF虽然既要写内存又要写硬盘,但是他的效率没有降低多少.

但是如果把数据写在缓冲区的时候,本质上还是写在缓存中的,如果注解突然掉电或者进程崩溃,缓冲区的数据就会丢失.这时候,Redis就给出了一些同步硬盘中AOF文件的频率选项,也就是更新缓冲区数据的频率选项.

Redis提供了多种AOF缓冲区同步文件策略,由参数appendfsync控制:

可配置值

说明

always

命令写入aof_buf后立即调用fsync同步

everysec

每秒由后台线程调用fsync同步

no

不主动调用fsync,依赖操作系统

系统调用writefsync的区别在于,

write操作触发延迟写机制,而fsync强制同步到磁盘。

刷新频率越高,性能影响越大,同时数据的可靠性越高,刷新频率越低,性能影响越小,数据的可靠性越低.

  • always配置虽然最安全但性能差;
  • no配置提高了性能但增加了数据丢失的风险;
  • everysec是默认且推荐的配置,它能在数据安全性和性能间取得较好的平衡。

缓冲区刷新率也可以在配置文件中进行配置.具体的配置项是 appendfsync ,程序员可以根据自己的需要进行更改.

4 重写机制

随着AOF(Append Only File)文件体积的持续增长,文件会越来越大,这会影响到Redis下次启动时的启动时间。

  • 因为Redis在启动时需要读取AOF文件的内容,而AOF记录的是操作Redis的中间过程。
  • 实际上,Redis重启时关注的是 最终的数据状态。
  • 为了优化这一过程,AOF可以通过 剔除冗余操作和合并操作 来减少文件大小,这就是AOF的重写机制。

示例1

  • 原始操作:lpush key 111lpush key 222
  • 优化后:lpush key 111 222

示例2

  • 原始操作:set key 111set key 222
  • 优化后:只保留最后一个设置操作 set key 222
工作流程
  1. 命令写入(append):所有写入命令追加到aof_buf(缓冲区)中。
  2. 文件同步(sync):根据配置的策略向硬盘同步AOF缓冲区内容。
  3. 文件重写(rewrite):定期对AOF文件进行重写以压缩其体积。
  4. 重启加载(load):服务器启动时加载AOF文件恢复数据。

触发条件
  • 手动触发:可以调用bgrewriteaof指令来触发AOF重写。
  • 自动触发:依据配置参数auto-aof-rewrite-min-sizeauto-aof-rewrite-percentage确定自动触发时机,前者表示AOF文件相对于上次重写时 增加的比例,后者表示触发 重写的最小文件大小。
混合持久化

为了解决纯文本写入的成本问题,Redis引入了混合持久化模式,结合了RDB和AOF的优点。

通过配置项aof-use-rdb-preamble激活此功能后,Redis会在AOF重写时先以RDB二进制格式保存当前内存状态,之后的操作则继续以AOF文本格式追加到文件后面,重写时为 RDB 格式。

这种策略减少了写入成本,同时保持了AOF的实时性。

持久化 sum

  1. Redis提供了两种持久化方案:RDB和AOF。
  2. RDB视为内存快照,产生的内容紧凑,恢复速度快,但不适合实时持久化,通常用于冷备和主从复制。
  3. AOF视为修改命令的保存,并通过 重写机制定期压缩AOF文件。
  4. RDB和AOF都利用Linux 子进程拥有父进程 内存快照 的特点进行持久化,尽量不影响主进程处理命令。

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

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

相关文章

springai结合ollama

目录 ollama 介绍 使用 下载: 安装: 点击这个玩意next就行了。 运行 spring ai使用ollama调用本地部署的大模型 加依赖 配置yml 写代码 ollama 介绍 官网:Ollama Ollama是一个用于部署和运行各种开源大模型的工具; …

关于Chrome自动同步书签的解决办法

前言 并不一定适用所有用户, 目前我在网上搜集了一些资料,也做了一些尝试。 就我个人总结的经验来讲,分享大家以下几种办法: 1.书签同步插件 点击如下🔗: Chrome书签同步https://bm.famend.cn/ …

SpringMVC纯注解快速开发

此文章适合具有一定的java基础的同学看哦,如果有看不懂的基本代码还是先补补java基础哦。 此教程带您不使用xml文件而是纯注解开发,易懂、快捷、迅速,从0开始搭建,很快就能构建起一个SpringMVC项目,能学到两种使用tom…

16-02、JVM系列之:内存与垃圾回收篇(二)

JVM系列之:内存与垃圾回收篇(二) ##本篇内容概述: 1、堆Heap Area 2、方法区Method Area 3、运行时数据区总结 4、对象的实例化内存布局和访问定位一、堆 Heap Area 1、堆的核心概念 一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心…

第二篇:k8s工作流程

我们来看通过deployment部署pod的常规流程: kubectl向apiserver发送部署请求(例如使用 kubectl create -f deployment.yml)apiserver将 Deployment 持久化到etcd;etcd与apiserver进行一次http通信。controller manager通过watch a…

「Mac畅玩鸿蒙与硬件39」UI互动应用篇16 - 倒计时环形进度条

本篇将带你实现一个倒计时环形进度条应用。用户可以设置倒计时的时间,启动倒计时后,应用会动态显示一个随着时间递减的环形进度条,同时伴有数字倒计时显示。这是结合动画效果和时间管理的实用示例。 关键词 UI互动应用倒计时器环形进度条动…

Qt Qtablewidget 标题 QHeaderView 增加可选框 QcheckBox

创建自定义QHeaderView #pragma once#include <QObject> #include <QHeaderView> #include <QPainter> #include <QMouseEvent>class SSHeaderView : public QHeaderView {Q_OBJECTprivate:bool isChecked;int m_checkColIdx; public:SSHeaderView(i…

Java 单元测试模拟框架-Mockito 的介绍

Mockito 是什么 Mockito 是一个用于单元测试的模拟框架&#xff0c;基于它可以使用简洁易用的API编写出色的测试。 Mockito 允许开发人员创建和管理模拟对象&#xff08;mock objects&#xff09;&#xff0c;以便在测试过程中替换那些不容易构造或获取的对象。 Mockito的基本…

斯坦福李飞飞《AI Agent:多模态交互前沿调查》论文

多模态AI系统很可能会在我们的日常生活中无处不在。将这些系统具身化为物理和虚拟环境中的代理是一种有前途的方式&#xff0c;以使其更加互动化。目前&#xff0c;这些系统利用现有的基础模型作为构建具身代理的基本构件。将代理嵌入这样的环境中&#xff0c;有助于模型处理和…

shell语法(1)bash

shell是我们通过命令行与操作系统沟通的语言&#xff0c;是一种解释型语言 shell脚本可以直接在命令行中执行&#xff0c;也可以将一套逻辑组织成一个文件&#xff0c;方便复用 Linux系统中一般默认使用bash为脚本解释器 在Linux中创建一个.sh文件&#xff0c;例如vim test.sh…

十六(AJAX3)、XMLHttpRequest、Promise、简易axios封装、案例天气预报、lodash-debounce防抖

1. XMLHttpRequest 1.1 XMLHttpRequest-基本使用 /* 定义&#xff1a;XMLHttpRequest&#xff08;XHR&#xff09;对象用于与服务器交互。通过 XMLHttpRequest 可以在不刷新页面的情况下请求特定 URL&#xff0c;获取数据。这允许网页在不影响用户操作的情况下&#xff0c;更…

AI效率手册学习笔记

目录 概要 主流的AI工具 提示词工程 概要 多一个工具&#xff0c;就意味着我们多一个助手&#xff0c;多一个信息源渠道&#xff0c;也就相当于多一份帮助。 学习书籍&#xff1a;《AI效率手册&#xff1a;从ChatGPT开启高效能》常青 著 出版时间&#xff1a;2024-10-01 主…

瑞芯微RK3566/RK3568开发板安卓11固件ROOT教程,Purple Pi OH演示

本文介绍RK3566/RK3568开发板Android11系统&#xff0c;编译ROOT权限固件的方法。触觉智能Purple Pi OH鸿蒙开发板演示&#xff0c;搭载了瑞芯微RK3566四核处理器&#xff0c;Laval鸿蒙社区推荐开发板&#xff0c;已适配全新OpenHarmony5.0 Release系统&#xff0c;SDK源码全开…

【Linux】线程概念 | 线程控制

文章目录 &#x1f449;知识补充&#x1f448;&#x1f449;Linux线程概念&#x1f448;什么是线程Makefile线程 VS 进程线程的优点线程的缺点线程异常线程用途 &#x1f449;线程控制&#x1f448;线程终止pthread_exit 函数pthread_cancel 函数线程 ID 的深入理解在多线程的场…

LongVU:用于长视频语言理解的空间时间自适应压缩

晚上闲暇时间看到一种用于长视频语言理解的空间时间自适应压缩机制的研究工作LongVU&#xff0c;主要内容包括&#xff1a; 背景与挑战&#xff1a;多模态大语言模型&#xff08;MLLMs&#xff09;在视频理解和分析方面取得了进展&#xff0c;但处理长视频仍受限于LLM的上下文长…

爬虫项目基础知识详解

文章目录 Python爬虫项目基础知识一、爬虫与数据分析1.1 Python中的requests库Requests 库的安装Requests 库的 get() 方法爬取网页的通用代码框架HTTP 协议及 Requests 库方法Requests 库主要方法解析 1.2 python中的json库1.3 xpath学习之python中lxml库html了解html结构html…

LeetCode - #152 乘积最大子数组(Top 100)

文章目录 前言1. 描述2. 示例3. 答案关于我们 前言 本题为 LeetCode 前 100 高频题 我们社区陆续会将顾毅&#xff08;Netflix 增长黑客&#xff0c;《iOS 面试之道》作者&#xff0c;ACE 职业健身教练。&#xff09;的 Swift 算法题题解整理为文字版以方便大家学习与阅读。 …

记一次跑前端老项目的问题

记一次跑前端老项目的问题 一、前言二、过程1、下载依赖2、启动项目3、打包 一、前言 在一次跑前端老项目的时候&#xff0c;遇到了一些坑&#xff0c;这里记录一下。 二、过程 1、下载依赖 使用 npm install下载很久&#xff0c;然后给我报了个错 core-js2.6.12: core-js…

无约束最优化问题的求解算法

无约束最优化问题的求解算法 使用梯度下降法目的和原因 目的 梯度下降法(Gradient Descent)是一个算法&#xff0c;但不是像多元线性回归那样是一个具体做回归任务的算法&#xff0c;而是一个非常通用的优化算法来帮助一些机器学习算法求解出最优解的&#xff0c;所谓的通用就是…

VideoBooth: Diffusion-based Video Generation with Image Prompts

VideoBooth: Diffusion-based Video Generation with Image Prompts 概括 文章提出了一个视频生成模型VideoBooth&#xff0c;输入一张图片和一个文本提示词&#xff0c;即可输出保持图片中物体且符合文本提示词要求的视频。 方法 粗-细两阶段设计&#xff1a;1&#xff09;…