Redis 数据持久化之AOF
AOF(Append Only File)


以日志的形式来记录每个写操作,将Redis执行过的所有写指令记录下来(读操作不记录),只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构建数据,换言之redis重启的化就根据日志文件的内容将写指令从前往后执行一次以完成数据的恢复工作。

默认情况下,redis是没有开启AOF(append only file)的,开启AOF功能需要设置配置:appendonly yes。
AOF保存的是appendonly.aof文件
AOF持久化的工作流程


AOF缓冲区的三种写回策略
配置文件Redis.conf的定义

1.Always
同步写回:每个写命令执行完立刻同步地将日志写回磁盘
2.everysec
每秒写回:每个写命令执行完,只是先把日志写到AOF文件的内存缓冲区,每隔1秒把缓冲区中的内容写入磁盘
3.no
操作系统控制的写回,每个写命令执行完,只是先把日志写到AOF文件的内存缓冲区,由操作系统决定何时将缓冲区内容写回磁盘
三种写回策略小总结

AOF配置/启动/修复/恢复
版本6与7的AOF区别

开启AOF的功能

使用默认的写回策略,每秒钟

AOF保存文件的路径设置
redis 6 中AOF保存文件的位置和RDB保存文件的位置一样,都是通过redis,conf配置文件的dir配置

redis 7中的设置

redis6 中appendonlyfile有且仅有一个

到了redis 7中采用了Multi Part AOF的设计,从1到3:基础文件+增量文件+清单文件


文件的定义

实操
1.开启AOF的功能

2.备份AOF相关的文件,同时删除RDB相关的文件

3.执行flushdb

4. 清空以及恢复appendonly相关的文件

5.重启redis服务,数据恢复

相关的步骤总结

异常恢复

1.故意乱写改动AOF文件
vim appendonly.aof.1.incr.aof

2. shutdown redis然后重启
3. 查看docker 日志

存在异常,需要使用指令进行修复
redis-check-aof --fix /home/run/redis/data/appendonlydir/appendonly.aof.1.incr.aof

AOF的优势

更好的保护数据不丢失、性能高、可做紧急回复
AOF的缺点

相同数据集的数据而言,AOF要远大于RDB文件,恢复速率慢于RDB。AOF运行效率要慢于RDB,每秒同步策略效率较好,不同步效率和rdb相同
AOF重写机制
上面AOF的缺点中,提到过AOF的文件会变得越来越大,于是AOF出现了日志重写的机制,当AOF文件的大小超过所设定的峰值的时候,redis就会自动启动AOF文件的内容压缩


一句话:启动AOF文件的内容压缩,只保留可以恢复数据的最小指令集。
相关配置

触发机制
自动触发:满足配置文件中的选项后,Redis会记录上次重写时的AOF大小,默认配置是当AOF文件大小是上次rewrite后大小的一倍且文件大于64M时
什么叫只保留可以恢复数据的最小指令集?

案例说明

关闭混合的配置

自动触发


故意设置大key

查看appendonlyfile中文件的变化,大小从51变成240

再循环对1个k1设置,直到达到1kb的阈值

达到阈值后,重写后的日志文件从1变为2

base.aof文件中变成了12行,只保留了最小的结果集,开启了瘦身计划


手动重写BGREWRITEAOF

日志文件从2变成3,人工干预,没有达到阈值

AOF重写结论

AOF重写原理
1:在重写开始前,redis会创建一个“重写子进程”,这个子进程会读取现有的AOF文件,并将其包含的指令进行分析压缩并写入到一个临时文件中。
2:与此同时,主进程会将新接收到的写指令一边累积到内存缓冲区中,一边继续写入到原有的AOF文件中,这样做是保证原有的AOF文件的可用性,避免在重写过程中出现意外。
3:当“重写子进程”完成重写工作后,它会给父进程发一个信号,父进程收到信号后就会将内存中缓存的写指令追加到新AOF文件中
4:当追加结束后,redis就会用新AOF文件来代替旧AOF文件,之后再有新的写指令,就都会追加到新的AOF文件中
5:重写aof文件的操作,并没有读取旧的aof文件,而是将整个内存中的数据库内容用命令的方式重写了一个新的aof文件,这点和快照有点类似
AOF常用参数配置以及优化

RDB-AOF 混合持久化

可否共存,共存听谁的?AOF

数据恢复顺序和加载流程
在同时开启rdb和aof持久化时,重启是只会加载aof文件,不会加载rdb文件

怎么选,用哪个?

在这种情况下,当redis重启的时候会优先载入AOF文件来恢复原始的数据。
因为在通常情况下AOF文件保存的数据集要比RDB文件保存的数据集要完整。
RDB的数据不实时,同时使用两者时服务器重启也只会找AOF文件。那要不要只使用AOF呢?作者建议不要,因为RDB更适合用于备份数据库(AOF在不断变化不好备份),留着rdb作为一个万一的手段。
RDB+AOF混合模式


1 开启混合方式设置
设置aof-use-rdb-preamble的值为 yes yes表示开启,设置为no表示禁用
2 RDB+AOF的混合方式----------> 结论:RDB镜像做全量持久化,AOF做增量持久化
先使用RDB进行快照存储,然后使用AOF持久化记录所有的写操作,当重写策略满足或手动触发重写的时候,将最新的数据存储为新的RDB记录。这样的话,重启服务的时候会从RDB和AOF两部分恢复数据,既保证了数据完整性,又提高了恢复数据的性能。
简单来说:混合持久化方式产生的文件一部分是RDB格式,一部分是AOF格式。AOF包括了RDB头部+AOF混写

纯缓存模式–同时关闭RDB与AOF

相关文章:
Redis 数据持久化之AOF
AOF(Append Only File) 以日志的形式来记录每个写操作,将Redis执行过的所有写指令记录下来(读操作不记录),只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构建数据,换…...
【芯片验证】verificationguide上的74道SystemVerilog面试题
诧异啊,像我这种没事在网上各处捡东西吃的人为什么之前一直没有用过verificationguide这个网站呢?总不能是大家都已经看过就留下我不知道吧。前几天在论坛上和朋友谈论验证面试题时才搜到这个网站的,感觉挺有意思: .: Verification Guide :.verificationguide.com/https…...
C++进阶知识10 封装unordered_map和unordered_set
封装unordered_map和unordered_set 1. 模拟实现unordered_map和unordered_set1.1 实现出复⽤哈希表的框架,并⽀持insert 1. 模拟实现unordered_map和unordered_set 1.1 实现出复⽤哈希表的框架,并⽀持insert • 参考源码框架,unordered_map…...
大白话JavaScript数据类型判断方法的原理与实践
大白话JavaScript数据类型判断方法的原理与实践 答题思路 明确 JavaScript 数据类型:JavaScript 数据类型分为基本数据类型(如 Number、String、Boolean、Null、Undefined、Symbol)和引用数据类型(如 Object、Array、Function 等…...
Java后端高频面经——计算机网络
TCP/IP四层模型?输入一个网址后发生了什么,以百度为例?(美团) (1)四层模型 应用层:支持 HTTP、SMTP 等最终用户进程传输层:处理主机到主机的通信(TCP、UDP&am…...
面试题(二)--Object中的常见方法
Object Java的Object是所有Java类的父类,所有的Java类直接或者间接的继承了Object类,Object类位于java.lang包中(编译时自动导入),主要提供了11种方法。 /*** native 方法,用于返回当前运行时对象的 Class…...
运行OpenManus项目(使用Conda)
部署本项目需要具备一定的基础:Linux基础、需要安装好Anaconda/Miniforge(Python可以不装好,直接新建虚拟环境的时候装好即可),如果不装Anaconda或者Miniforge,只装过Python,需要确保Python是3.…...
如何在 Windows 10 启用卓越性能模式及不同电源计划对比
在使用 powercfg -duplicatescheme 命令启用 “卓越性能模式”(即 Ultimate Performance 模式)之前,有几个前提条件需要注意: 前提条件: 系统版本要求:卓越性能模式 仅在 Windows 10 专业版 或更高版本&a…...
设备管理系统功能与.NET+VUE(IVIEW)技术实现
在现代工业和商业环境中,设备管理系统(Equipment Management System,简称EMS)是确保设备高效运行和维护的关键工具。本文采用多租户设计的设备管理系统,基于.NET后端和VUE前端(使用IVIEW UI框架)…...
分布式光伏发电的发展现状与前景
分布式光伏发电的发展现状与前景 1、分布式光伏发电的背景2、分布式光伏发电的分类2.1、集中式光伏发电2.1.1、特点、原则2.1.2、优点2.1.3、缺点 2.2、分布式光伏发电2.2.1、特点、原则2.2.2、优点2.2.3、缺点 2.3、对比 3、分布式光伏发电的现状4、分布式光伏发电的应用场景4…...
数据类设计_图片类设计之2_无规则图类设计(前端架构基础)
前言 学的东西多了,要想办法用出来.C和C是偏向底层的语言,直接与数据打交道.尝试做一些和数据方面相关的内容 引入 接续上一篇数据类设计_图片类设计之1_矩阵类设计(前端架构基础)-CSDN博客,讨论非规则图类型的设计 无规则图的简单定义 前面的矩阵类,有明显的特征:长,宽,行和…...
aws(学习笔记第三十二课) 深入使用cdk(API Gateway + event bridge)
文章目录 aws(学习笔记第三十二课) 深入使用cdk学习内容:1. 使用aws API Gatewaylambda1.1. 以前的练习1.2. 使用cdk创建API Gateway lambda1.3. 确认cdk创建API Gateway lambda 2. 使用event bridge练习producer和consumer2.1. 代码链接2.2. 开始练习2.3. 代码部…...
计算机视觉算法实战——老虎个体识别(主页有源码)
✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ 1. 领域介绍 老虎个体识别是计算机视觉中的一个重要应用领域,旨在通过分析老虎的独特条纹图案,自动识别和区…...
Qt添加MySql数据库驱动
文章目录 一. 安装MySql二.编译mysql动态链接库 Qt版本:5.14.2 MySql版本:8.0.41 一. 安装MySql 参考这里进行安装:https://blog.csdn.net/qq_30150579/article/details/146042922 将mysql安装目录里的bin,include和lib拷贝出来…...
蓝桥杯备考:图论初解
1:图的定义 我们学了线性表和树的结构,那什么是图呢? 线性表是一个串一个是一对一的结构 树是一对多的,每个结点可以有多个孩子,但只能有一个父亲 而我们今天学的图!就是多对多的结构了 V表示的是图的顶点集…...
【每日学点HarmonyOS Next知识】输入框自动获取焦点、JS桥实现方式、Popup设置全屏蒙版、鼠标事件适配、Web跨域
1、HarmonyOS TextInput或TextArea如何自动获取焦点? 可以使用 focusControl.requestFocus 对需要获取焦点的组件设置焦点,具体可以参考文档: https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/ts-universal-attribut…...
网络空间安全(19)CSRF攻防
一、简介 跨站请求伪造(Cross-Site Request Forgery,简称CSRF)是一种网络攻击方式。攻击者通过诱导受害者访问恶意页面,利用受害者在被攻击网站已经获取的注册凭证(如Cookie),绕过后台的用户验证…...
Unity大型游戏开发全流程指南
一、开发流程与核心步骤 1. 项目规划与设计阶段 需求分析 明确游戏类型(MMORPG/开放世界/竞技等)、核心玩法(战斗/建造/社交)、目标平台(PC/移动/主机)示例:MMORPG需规划角色成长树、副本Boss…...
[mybatis]resultMap详解
resultMap Mybatis中提供了resultMap功能,可以将数据库查询结果映射到Java对象,用于解决 字段名与属性名不一致 或 复杂关系(如一对多)的映射问题。 比如一个User类,在它的属性里还有另一个子对象(或者多…...
DEV C++安装
点击----我接受 点击--下一步 选择安装路径: D盘安装选择路径: 点击----安装等待安装完成点击---完成即可 一路下一步即可...
ESP32驱动OV3660摄像头实现物体轮廓识别(摄像头支持红外夜视、边缘AI计算)
目录 1、传感器特性 2、硬件原理图 3、驱动程序 ESP32-S3 AI智能摄像头模块是一款专为智能家居和物联网应用打造的高性能边缘AI开发模组。它集成了摄像头、麦克风、音频功放、环境光传感器和夜视补光灯,无需依赖云端即可实现本地化AI推理。 凭借TensorFlow Lite、YOLO和O…...
深入探讨 Docker 层次结构及其备份策略20250309
深入探讨 Docker 层次结构及其备份策略 本文将深入探讨 Docker 层次结构 以及在 不同场景下应选择哪种备份方式。通过本文的介绍,您将对如何高效地管理和迁移 Docker 容器有更深的理解。 📌 什么是 Docker 层次结构? Docker 镜像采用了 分…...
游戏引擎学习第145天
仓库:https://gitee.com/mrxiao_com/2d_game_3 今天的计划 目前,我们正在完成遗留的工作。当时我们已经将声音混合器(sound mixer)集成到了 SIMD 中,但由于一个小插曲,没有及时完成循环内部的部分。这个小插曲主要是…...
Electron:点击右键保存图片到本地
前期插件 前端请求后台的一种方法 npm install got -S用于获取ArrayBuffer文件类型 npm install image-type -S生成随机数 npm install randomstring -D增加右击事件 点击右击事件的时候加载菜单 const imageRightSave require("./ImageRightSave") // 创建右…...
在 Docker 中搭建GBase 8s主备集群环境
本文介绍了如何在同一台机器上使用 Docker 容器搭建GBase 8s主备集群环境。 拉取镜像 拉取GBase 8s的最新镜像 docker pull liaosnet/gbase8s或者docker pull liaosnet/gbase8s:v8.8_3513x25_csdk_x64注:在tag为v8.8_3513x25_csdk_x64及之后的版本中,…...
如何在el-input搜索框组件的最后面,添加图标按钮?
1、问题描述 2、解决步骤 在el-input组件标签内,添加一个element-plus的自定义插槽, 在插槽里放一个图标按钮即可。 3、效果展示 结语 以上就是在搜索框组件的末尾添加搜索按钮的过程。 喜欢本篇文章的话,请关注本博主~~...
NoteGen是一款开源跨平台的 AI 笔记应用,专注于 recording 和 writing ,基于 Tauri 开发
一、软件介绍 文末提供程序和源码下载 NoteGen 是一款专注于记录和写作的跨平台 AI 笔记应用,基于 Tauri 开发。NoteGen 的核心理念是将记录、写作和 AI 结合使用,三者相辅相成。记录功能可以帮助用户快速捕捉和整理碎片化知识。整理功能是连接记录和写…...
第五次CCF-CSP认证(含C++源码)
第五次CCF-CSP认证 第一道(easy)思路及AC代码 第二道(easy)思路及AC代码solution 1solution 2 第三道(mid)思路及AC代码(mid) 第一道(easy) 题目链接 思路及…...
个人学习编程(3-06) 搜索
树的高度: 题目: PS G:\vscodetest> .\ab.exe 5 5 1 2 1 4 1 5 2 3 3 #include <stdio.h> #include <vector> #include <queue> using namespace std; int main() {int n,m;scanf("%d %d",&n,&m);vector<vec…...
Springboot中的@Value注解:用法与潜在问题探索
在Spring Boot开发中,有个非常实用的注解,那就是Value!它可以帮助我们轻松地从配置文件中读取属性值。想象一下,在应用程序中管理各种配置,比如数据库连接信息、服务URL或者API密钥等,使用Value是多么方便呀…...
