【征服redis8】Redis的AOF持久化

Redis 支持多种持久化方式来保证数据的可靠性和持久性。前面我们介绍了RDB方式。我们我们介绍第二种方式——AOF(Append Only File)机制是一种常用的持久化方式,它记录了所有对 Redis 数据库进行修改的命令,在 Redis 重启时可以使用这些命令来重构数据库状态。 

目录

1.AOF的基本原理

1.1 如何启动AOF

1.2 AOF 文件的创建

1.3. AOF 文件的写入

1.4. AOF 文件的重写

1.5. AOF 文件的恢复

1.6. 小结

2. RDB和AOF混合方式

3 .AOF 持久化实践


1.AOF的基本原理

1.1 如何启动AOF

在 Redis 的配置文件中,可以通过以下配置项来设置 AOF 持久化相关的参数:

1. appendonly:设置是否开启 AOF 持久化,默认为 no(关闭状态)。

2. appendfilename:设置 AOF 文件名,默认为 appendonly.aof。

3. appendfsync:设置 AOF 文件同步策略,有以下三种可选值:

- always:每次写入都会同步到磁盘,最安全但性能最差;
- everysec:每秒同步一次到磁盘,安全性和性能的折中方案;
- no:由操作系统决定何时同步,最不安全但性能最好。

4. auto-aof-rewrite-percentage:设置 AOF 重写触发的条件之一,即 AOF 文件大小增长率达到该值时触发 AOF 重写,默认为 100。

5. auto-aof-rewrite-min-size:设置 AOF 重写触发的条件之一,即 AOF 文件大小达到该值时触发 AOF 重写,默认为 64MB。

6. aof-load-truncated:设置当 Redis 以 AOF 模式启动时,是否自动修复截断的 AOF 文件,默认为 yes。

7. aof-use-rdb-preamble:设置是否在 AOF 文件中使用 RDB 文件的前缀,默认为 yes。

修改 Redis 配置文件后,需要重启 Redis 才能使配置生效。同时,对于 AOF文件同步策略的选择,需要根据实际情况进行权衡和选择。如果对数据的安全性要求非常高,可以选择 always
策略;如果对性能的要求比较高,可以选择 everysec 策略。

1.2 AOF 文件的创建

当启用 AOF 持久化机制时,Redis 会在启动时创建一个 AOF 文件,用于记录所有写命令。AOF 文件的默认文件名为 appendonly.aof,可以通过配置文件中的 appendfilename 参数进行修改。如果 AOF 文件已经存在,则 Redis 会在启动时读取文件中的内容,并将其加载到内存中。

1.3. AOF 文件的写入

当 Redis 执行写命令时,会将命令追加到 AOF 文件的末尾。如果 AOF 文件不存在,则 Redis 会自动创建一个新的 AOF 文件。如果 AOF 文件已经存在,则 Redis 会将命令追加到文件的末尾。

Redis 为了提高写入性能,通常会将多个命令缓存到内存中,然后在满足一定条件时批量写入到 AOF 文件中。具体来说,Redis 会维护一个 AOF 缓冲区,将每个写命令追加到缓冲区的末尾。当缓冲区的大小超过一定阈值时,或者缓冲区中的命令已经等待了一定时间后,Redis 会将缓冲区中的命令批量写入到 AOF 文件中。
 

1.3. AOF 文件的同步
为了保证写命令的可靠性和持久性,Redis 会在写入 AOF 文件后进行同步操作,将数据从内存中刷到磁盘中。这就是我通常所说的刷盘操作。刷盘操作可以分为两种方式:

  • 同步磁盘上的所有数据,每次写入 AOF 文件时,Redis 会调用 fsync 系统调用将数据从内存刷到磁盘中。这种方式可以保证数据的可靠性,但是会带来较大的性能损耗。
  • 定期同步磁盘上的数据,Redis 也可以通过配置文件中的 appendfsync 参数来控制 AOF 文件的同步方式。其中,有三种常用的方式:
  1. always:每次写入 AOF 文件时都进行同步操作,可以保证数据的可靠性,但是会带来较大的性能损耗。
  2. everysec:每秒钟对 AOF 文件进行一次同步操作,可以在一定程度上平衡数据安全和性能需求。
  3. no:不进行同步操作,只在 Redis 进程退出时进行一次同步操作,可以提高性能,但是会带来一定的数据风险。

这三种方式的对比,我们可以通过下面的表来判断:

总结来说,就是:

  1. 如果要高性能,就选择 No 策略;
  2. 如果要高可靠,就选择 Always 策略;
  3. 如果允许数据丢失一点,但又想性能高,就选择 Everysec策略。

1.4. AOF 文件的重写

Redis AOF 文件在长时间运行后可能会变得非常大,不仅占用磁盘空间,还会影响 Redis 的性能。为了解决这个问题,Redis 提供了 AOF 文件重写机制,可以将 AOF 文件中的写命令进行压缩,生成一条等效的命令序列,从而减少 AOF 文件的大小。

AOF 文件重写机制的实现原理如下:

(1)Redis 会启动一个新的子进程,用于执行 AOF 文件重写操作。

(2)Redis 主进程会将所有写命令发送到子进程中,子进程会执行这些命令,并生成一条等效的命令序列。

(3)子进程会将等效命令序列写入到一个新的 AOF 文件中,同时在写入过程中进行同步操作,保证数据的可靠性。

(4)当子进程完成 AOF 文件的重写操作后,Redis 主进程会将新的 AOF 文件重命名为原来的 AOF 文件,并删除旧的 AOF 文件。

需要注意的是,AOF 文件重写操作只会对已经执行过的写命令进行压缩,新的写命令仍然会被追加到 AOF 文件的末尾。Redis 会周期性地检查 AOF 文件的大小,并在满足一定条件时触发 AOF 文件重写操作。

1.5. AOF 文件的恢复

AOF 的数据恢复过程设计很巧妙,它模拟一个 Redis 的服务过程。Redis 首先虚拟一个客户端,读取 AOF 文件恢复 Redis 命令和参数;接着过程就和服务客户端一样执行命令相应的函数,从而恢复数据,这样做的目的无非是提高代码的复用率。这些过程主要在 loadAppendOnlyFile() 中实现。我们可以理解为假的重放。

真实的过程当 Redis 重启时,会根据 AOF 文件中记录的命令重构数据库状态。具体来说,Redis 会按照 AOF 文件中记录的命令顺序,逐个执行命令,并在执行过程中重建数据库状态。需要注意的是,AOF 文件的恢复过程可能会比较耗时,因此需要在 Redis 配置文件中设置 AOF 文件的恢复方式,可以选择同步方式(always、everysec)或异步方式(no)。

所以,Redis AOF 持久化机制,其实说白了就是redis启动的时候创建一个server.aof_buf的文件,通过一个文件,实现了将写命令追加到 AOF 文件中,并在需要时同步到磁盘中,从而保证了数据的可靠性和持久性。 当异常宕机需要恢复数据的时候又通过读取文件,回放之前的命令,进行数据还原。
由此大家也可以推断出它存在的弊端。

1.6. 小结

对于相同的数据集来说,AOF 文件的体积通常要大于 RDB 文件的体积。

根据所使用的 fsync 策略,AOF 的速度可能会慢于 RDB 。

在一般情况下, 每秒 fsync 的性能依然非常高, 而关闭 fsync 可以让 AOF 的速度和 RDB 一样快, 即使在高负荷之下也是如此。 不过在处理巨大的写入载入时,RDB 可以提供更有保证的最大延迟时间(latency)

到此我们学完了 Redis 的持久化方式 RDB 和AOF 。那么我们对比一下。整理出如下表格:

RDBAOF
启动优先级
体积比 AOF 小比 RDB 大
恢复速度比 AOF 快比 RDB 慢
数据安全性在定时备份时可能会丢失一定量的数据根据同步策略决定,相对更安全
数据一致性RDB 持久化的数据可能不是最新的,但数据一致性较高AOF 持久化的数据较新,但数据一致性较低
运维复杂度相对简单,只需要定期备份 RDB 文件即可相对复杂,需要配置 AOF 缓冲区大小、同步策略等参数
写入性能相对较高,因为 RDB 只需要生成一次快照文件即可完成持久化操作相对较低,因为 AOF 需要将每一次写操作都写入到 AOF 文件中
读取性能相对较高,因为 RDB 文件读取速度快相对较低,因为需要将 AOF 文件中的所有写操作都执行一遍才能恢复
文件格式二进制格式,比较紧凑文本格式,可读性好
恢复方式通过加载 RDB 文件来恢复数据库通过加载 AOF 文件并执行其中的写操作来恢复数据库
文件重写方式通过 BGSAVE 命令生成新的 RDB 文件来实现文件重写通过执行 BGREWRITEAOF 命令来生成新的 AOF 文件实现文件重写

2. RDB和AOF混合方式

Redis 4.0 中提出了一个混合使用 AOF 日志和内存快照的方法。简单来说,内存快照以一定的频率执行,在两次快照之间,使用 AOF 日志记录这期间的所有命令操作。

混合方式可以同时利用 RDB 的快速恢复和 AOF 的数据安全性。在这种混合方式下,Redis 会同时生成 RDB 文件和 AOF 文件,来保证数据的安全性和可靠性。

具体来说,可以采用如下的持久化配置:

将 AOF 模式设置为 always,并设置合适的同步策略,以确保 Redis 在执行写操作时,都将对应的操作写入 AOF 文件中。

在 Redis 中启用 RDB 持久化,并设置一个合适的持久化间隔,以确保 Redis 在每隔一定时间内,执行一次 RDB 文件的快照生成操作。

将 Redis 配置为在启动时,先尝试使用 AOF 文件进行恢复,如果 AOF 文件不存在或损坏,则使用 RDB 文件进行恢复。

通过这种方式,可以将 RDB 和 AOF 的优点结合起来,从而达到更加全面的数据保护和恢复能力。同时也需要注意,这种方式会带来一定的存储和性能开销,需要根据实际情况进行权衡和优化。

参考 AOF

3 .AOF 持久化实践

这个和上一篇一样,后面研究一下如何在本地能启动多个redis然后再补充如何实战

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

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

相关文章

echarts X轴数据过多导致重叠展示不全问题(已解决)

问题 x轴数据过多导致坐标轴数据重叠 修改后 List item interval为0代表每个标签都显示,即间隔为0! 将其设置为我们想要的数值即可。 xAxis: {type: "time",splitLine: {show: false,},axisLine: {show: false,lineStyle: {color: &qu…

Spring MVC学习——解决请求参数中文乱码

解决请求参数中文乱码问题 1.POST请求方式解决乱码问题 在web.xml里面设置编码过滤器 <filter><filter-name>CharacterEncodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><…

lua使用resty.http做nginx反向代理(https请求,docker容器化部署集群),一个域名多项目转发

下载使用 链接&#xff1a;https://pan.baidu.com/s/1uQ7yCzQsPWsF6xavFTpbZg 提取码&#xff1a;htay –来自百度网盘超级会员V5的分享 在根目录下执行: # 从 github 上下载文件 git clone https://github.com/ledgetech/lua-resty-http.git # 将 lua-resty-http/lib/ 下的 r…

客户案例 | 思腾合力助力某能源公司地质数据智能化计算平台建设

助力某能源公司 地质数据智能化计算平台建设 石油行业是全球最大的行业之一&#xff0c;涉及到从地下或海底开采原油和天然气的勘探、开发、生产、运输、精炼和销售的全过程。石油不仅是世界上最主要的能源之一&#xff0c;还是化工产品的主要原料。石油行业的运作对全球经济有…

Java多线程并发篇----第二十篇

系列文章目录 文章目录 系列文章目录前言一、拒绝策略二、Java 线程池工作过程三、JAVA 阻塞队列原理前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 一、拒绝策略…

VS代码生成工具ReSharper v2023.3正式发布——支持C# 12

实质上&#xff0c;ReSharper特征可用于C#&#xff0c;VB.net&#xff0c;XML&#xff0c;Asp.net&#xff0c;XAML&#xff0c;和构建脚本。 使用ReSharper&#xff0c;你可以进行深度代码分析&#xff0c;智能代码协助&#xff0c;实时错误代码高亮显示&#xff0c;解决方案范…

AI-数学-高中-6-求分式函数值域(y的取值范围)

原作者视频&#xff1a;函数】4分式函数的值域&#xff08;易&#xff09;_哔哩哔哩_bilibili 1.一次比一次&#xff1a;分数函数&#xff0c;分子与分母都是1次。 1.1 画xy轴图&#xff0c;计算垂直渐近线移动数值、画出渐近线&#xff1a;用分母不能为0来计算&#xff0c;如…

1739. 迷宫的所有路径-深度优先搜索-DFS

代码&#xff1a; #include<bits/stdc.h> using namespace std; int n; int fx[4]{0,1,0,-1}; int fy[4]{1,0,-1,0}; bool vis[100][100]; int q[35][3]; int c; void print(int k){c;cout<<c<<":";for(int i1;i<k;i){cout<<q[i][1]<…

TypeError: strip_name() got an unexpected keyword argument ‘many‘问题的解决

引言 在读一本书《Learn Python Programming》1的第8章&#xff0c;按照书中的讲解先后安装了marshmallow和pytest第三方库&#xff0c;j进而按照书中的代码结构和代码在ch08文件夹下运行pytest tests&#xff0c;出现如下错误&#xff1a; ch08中的api.py的代码为&#xff1…

Qt/QML编程之路:Grid、GridLayout、GridView、Repeater(33)

GRID网格用处非常大,不仅在excel中,在GUI中,也是非常重要的一种控件。 Grid 网格是一种以网格形式定位其子项的类型。网格创建一个足够大的单元格网格,以容纳其所有子项,并将这些项从左到右、从上到下放置在单元格中。每个项目都位于其单元格的左上角,位置为(0,0)。…

K8s-架构

一、K8s节点划分 K8s集群包含Master(控制节点)和Node(工作节点)&#xff0c;应用部署在Node节点上。 集群架构图&#xff1a; 二、Master节点 Master节点分成四个组件&#xff1a;scheduler、ApiServer、Controller Manager、ETCD。类似三层结构&#xff0c;controller&#…

DolphinDB 与盈米基金达成战略合作,打造领先的资管机构投顾解决方案

1月16日上午&#xff0c;DolphinDB 与盈米基金在上海签署战略合作协议&#xff0c;共同开启专业资管投顾投研合作新篇章。 DolphinDB 联合创始人、COO 初阳春与盈米基金副总裁、研究院院长杨媛春出席仪式&#xff0c;并代表双方完成签约。 打造市场领先的资管机构投顾服务 盈…

Spring MVC学习之——RequestMapping注解

RequestMapping注解 作用 用于建立请求URL和处理请求方法之间的对应关系。 属性 value&#xff1a;指定请求的实际地址&#xff0c;可以是一个字符串或者一个字符串列表。 value可以不写&#xff0c;直接在括号中写&#xff0c;默认就是value值 RequestMapping(value“/hel…

【征服redis5】redis的Redisson客户端

目录 1 Redisson介绍 2. 与其他Java Redis客户端的比较 3.基本的配置与连接池 3.1 依赖和SDK 3.2 配置内容解析 4 实战案例&#xff1a;优雅的让Hash的某个Field过期 5 Redisson的强大功能 1 Redisson介绍 Redisson 最初由 GitHub 用户 “mrniko” 创建&#xff0c;并在…

FreeRTOS学习第7篇--周期性延迟和相对性延迟函数

目录 FreeRTOS学习第7篇--周期性延迟和相对性延迟函数时间延迟vTaskDelay函数原型vTaskDelayUntil函数原型PrintTask_Task任务相关代码片段实验现象本文中使用的测试工程 FreeRTOS学习第7篇–周期性延迟和相对性延迟函数 本文目标&#xff1a;学习与使用FreeRTOS中的延迟函数&…

wox 启动的cmd无法识别npm

安装软件步骤&#xff1a;everything->wox->nvm->npm->yarn 新打开的任意cmd窗口均发现可以识别npm和yarn命令&#xff0c;但是wox启动的cmd窗口就不行 联想到cmd的特性是一个cmd窗口打开后&#xff0c;其运行环境就会固定&#xff0c;不会随着你系统环境变量的更…

常见的系统性能指标:QPS、TPS

&#x1f339;作者主页&#xff1a;青花锁 &#x1f339;简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java微服务架构公号作者&#x1f604; &#x1f339;简历模板、学习资料、面试题库、技术互助 &#x1f339;文末获取联系方式 &#x1f4dd; 系列专栏目录 [Java项目…

python/c++ Leetcode题解——118. 杨辉三角

方法一:数学 思路及解法 杨辉三角,是二项式系数在三角形中的一种几何排列。它是中国古代数学的杰出研究成果之一,它把二项式系数图形化,把组合数内在的一些代数性质直观地从图形中体现出来,是一种离散型的数与形的结合。 杨辉三角具有以下性质: 1.每行数字左右对称,由…

二进制的详细理解

二进制 什么是2进制 逢2进1的计数规则 2进制 规则&#xff1a;逢2进1 数字&#xff1a;0 1 权&#xff1a;128 64 32 16 8 4 2 1 基数&#xff1a;2 10进制计数规则 10进制 规则&#xff1a;逢10进1 数字&#xff1a;0 1 2 3 4 5 6 7 8 9 权&#xff1a;万 …

【图形学】探秘图形学奥秘:图形变换的解密与实战

​&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;《图形学 | 图像解码》⏰诗赋清音&#xff1a;云生高巅梦远游&#xff0c; 星光点缀碧海愁。 山川深邃情难晤&#xff0c; 剑气凌云志自修。 ​ 目录 &#x1f30c;1. 初识模式识别…