当前位置: 首页 > news >正文

【征服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然后再补充如何实战

相关文章:

【征服redis8】Redis的AOF持久化

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

【动态规划】【二分查找】【C++算法】730. 统计不同回文子序列

作者推荐 【动态规划】【数学】【C算法】18赛车 涉及知识点 动态规划 二分查找 LeetCode730. 统计不同回文子序列 给你一个字符串 s ,返回 s 中不同的非空回文子序列个数 。由于答案可能很大,请返回对 109 7 取余 的结果。 字符串的子序列可以经由…...

android 和 opencv 开发环境搭建

本文详细说明给android项目添加opencv库的详细步骤,并通过实现图片灰度化来查看配置是否成功。 下载OPENCV ANDROID SDK 到官网下载 打开 https://opencv.org/releases/ 选择android,下载完成后解压出下面的文件: 安装android sdk 和 ndk …...

elasticsearch[一]-索引库操作(轻松创建)、文档增删改查、批量写入(效率倍增)

elasticsearch[一]-索引库操作(轻松创建)、文档增删改查、批量写入(效率倍增) 1、初始化 RestClient 在 elasticsearch 提供的 API 中,与 elasticsearch 一切交互都封装在一个名为 RestHighLevelClient 的类中,必须先完成这个对象的初始化,…...

tp6框架中Http类 请求的header、body参数传参 及post、file格式

引入Http类: 在需要使用的地方引入Http类: use think\facade\Http; GET请求示例:$response Http::get(https://example.com/api/resource); 设置Header参数: $headers [ Authorization > Bearer YourAccessToken, Conte…...

基于极限学习机的图像处理,基于ELM的图像分割,基于极限学习机的细胞分割

目录 背影 极限学习机 基于极限学习机的图像,基于ELM的图像分割 主要参数 MATLAB代码 效果图 结果分析 展望 完整代码下载链接:基于极限学习机的图像,基于ELM的图像分割(代码完整,数据齐全)资源-CSDN文库 https://download.csdn.net/download/abc991835105/88759192 背…...

ELAU C400/A8/1/1/1/00嵌入式系统中的模块动态加载技术

ELAU C400/A8/1/1/1/00嵌入式系统中的模块动态加载技术 ... 代码。这些script会根据模块名字查找模块对应的模块声明文件,并根据该 ... 的地址,注册时需提供模块名和模块重定位表的地址。加 ... 。这个表的表项是“模块名”到“模块重定位表地址”…...

github clone Failed to connect to github.com port 443 after xxx ms

最近克隆github项目时老是报超时,可以尝试以下解决方法 如果本地开启了代理还是clone超时,可以尝试最后一种方式解决 1、把 https 换成 http,如: git clone http:xxx2、更新本地hosts配置,可以参考这篇文章获取最新的…...

ARM的一些基础知识

1.低功耗接口 P-CHANNEL和Q-CHANNEL AMBA低功耗接口(一)Q_Channel_q-channel p-channel-CSDN博客 AMBA低功耗接口(二)P_Channel_p channel-CSDN博客 2.WFI和WFE指令 ARM WFI和WFE指令 ARM hint instruction-WFI(Wait For In…...

零售的数字化转型,利用AWS云服务资源如何操作?

国内市场趋于饱满,各行各业的发展接近瓶颈,就连零售行业都竞争激烈,随处可见的零售小店也预示着需要投入大量的人力,而且由于消费者的行为和预期已经发生了根本性变化,这迫使零售商不得不加速整个价值链的数字化转型&a…...

【通知】我的教学文章《Rust跟我学》已全部上线

大家好,我是get_local_info开源库作者带剑书生,现在我的《Rust跟我学》专栏文章已全部上线,它记录了我在写库时获得的重要Rust经验和技巧,是不同于《Rust语言编程》等简单实践的书籍。为您节省了学习时间,让您可以快速…...

Docker安全基线检查需要修复的一些问题

一、可能出现的漏洞 限制容器之间的网络流量 限制容器的内存使用量 为Docker启用内容信任 将容器的根文件系统挂载为只读 审核Docker文件和目录 默认情况下,同一主机上的容器之间允许所有网络通信。 如果不需要,请限制所有容器间的通信。 将需要相互通…...

MobX 的 Observable Array,如何转换成一个普通的数组

问题描述 访问mobx store里面的数据时打印结果为如下,是一个 MobX 的 Observable Array,而不是一个普通的数组。MobX 使用 Proxy 来实现响应式数据,因此打印的结果为的是 Proxy 对象。可是我需要的是实际的数组数据。 Proxy {0: Proxy, 1: …...

spring boot集成loback日志配置

1.spring boot中application.properties配置 logging.configclasspath:loback-config.xml 2.配置loback-config.xml <?xml version"1.0" encoding"UTF-8"?> <!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR <…...

【mars3d】 graphic.bindPopup(inthtml).openPopup()无需单击小车,即可在地图上自动激活弹窗的效果。

实现效果&#xff1a;new mars3d.graphic.FixedRoute({无需单击小车&#xff0c;即可在地图上实现默认打开弹窗的激活效果。↓↓↓↓↓↓↓↓ 相关链接说明&#xff1a; 1.popup的示例完全开源&#xff0c;可参考&#xff1a;功能示例(Vue版) | Mars3D三维可视化平台 | 火星科…...

工厂企业消防安全AI可视化视频智能监管解决方案

一、方案背景 2023年11月20日下午6时30分许&#xff0c;位于江苏省无锡市惠山区前洲街道的某公司突发严重火灾&#xff0c;共造成7人死亡。这次火灾提醒我们工业安全至关重要&#xff0c;企业都应该时刻保持警惕&#xff0c;加强安全意识和培训&#xff0c;提高应对突发事件的…...

【并发编程】synchornized原理

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;并发编程 ⛺️稳重求进&#xff0c;晒太阳 目录 Monitor概念 Java对象头 普通对象 数组对象 Monitor(锁) Monitor结构如下&#xff1a; 注意&#xff1a; 原理之synchornized 轻量…...

计算机网络-ACL访问控制列表

上一篇介绍NAT时候就看到了ACL这个东西了&#xff0c;这个是什么意思&#xff1f;有什么作用呢&#xff1f; 一、ACL访问控制列表 访问控制列表 (ACL, Access Control List)是由一系列permit或deny语句组成的、有序规则的列表。ACL是一个匹配工具&#xff0c;能够对报文进行匹配…...

论文学习记录之SeisInvNet(Deep-Learning Inversion of Seismic Data)

目录 1 INTRODUCTION—介绍 2 RELATED WORKS—相关作品 3 METHODOLOGY AND IMPLEMENTATION—方法和执行 3.1 方法 3.2 执行 4 EXPERIMENTS—实验 4.1 数据集准备 4.2 实验设置 4.3 基线模型 4.4 定向比较 4.5 定量比较 4.6 机理研究 5 CONCLUSION—结论 1 INTRODU…...

深度学习中的优化方法

深度学习中的优化问题通常指的是:寻找神经网络上的一组参数 θ \theta θ,它能显著地降低代价函数 J ( θ ) J(\theta) J(θ...

【设计模式之美】重构(三)之解耦方法论:如何通过封装、抽象、模块化、中间层等解耦代码?

文章目录 一. “解耦”概述二. 如何给代码“解耦”&#xff1f;1. 封装与抽象2. 中间层2.1. 引入中间层能**简化模块或类之间的依赖关系**。2.2. 引入中间层可以起到过渡的作用&#xff0c;能够让开发和重构同步进行&#xff0c;不互相干扰。 3. 模块化4. 其他设计思想和原则4.…...

Spring MVC学习之——Controller类中方法的返回值

Controller类中方法的返回值 1.返回ModelAndView RequestMapping("/hello")public ModelAndView hello(){//封装了页面和数据ModelAndView view new ModelAndView();//对这个请求的页面添加属性&#xff08;数据&#xff09;view.addObject("hello",&quo…...

IDEA中启动项目报堆内存溢出或者没有足够内存的错误

1.报错现象 java.lang.OutOfMemoryError: Java heap space 或者 Could not reserve enough space for object heap 2.解决办法 在运行配置中VM选项后加下面的配置&#xff1a; -server -XX:MaxHeapSize256m -Xms512m -Xmx512m -XX:PermSize128M -XX:MaxPermSize256m 3.JVM虚…...

Angular: DOCUMENT

不用原生的 document&#xff0c;是因为不利于后端渲染&#xff0c;所以避免使用原生浏览器的对象 import { DOCUMENT } from angular/common; import { Directive, Inject, Input, OnChanges, Output, Renderer2, SimpleChanges } from angular/core;Directive({selector: [a…...

mybatis-plus批量保存异常及效率优化

最近基于自己公司内部服务维护&#xff0c;发现其中调度中心近期出现不少错误日志&#xff0c;但是该任务却是正常执行&#xff0c;生成的报表数据也是正常的&#xff0c;所以很多天没有发现问题 这就匪夷所思了&#xff0c; 经仔细排查发现&#xff0c;是触发了feign超时hyst…...

查找局域网树莓派raspberry的mac地址和ip

依赖python库&#xff1a; pip install socket pip install scapy运行代码&#xff1a; import socket from scapy.layers.l2 import ARP, Ether, srpdef get_hostname(ip_address):try:return socket.gethostbyaddr(ip_address)[0]except socket.herror:# 未能解析主机名ret…...

乐观锁与悲观锁:高并发场景下的选择

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…...

vue2 省市区联动组件封装

在element ui中有级联选择器el-cascader,其实已经够用了,但是在实际需求中,发现el-cascader如果有三级,数据数组必须得三个才能完全展示,所以不符合实际需求,还是自定义封装吧 需求:省市区联动数组,有多少个显示多少个 这里使用element ui得el-select组件,思路是使用…...

VScode远程开发

VScode远程开发 在SSH远程连接一文中&#xff0c;我么介绍了如何使用ssh远程连接Jetson nano端&#xff0c;但是也存在诸多不便&#xff0c;比如:编辑文件内容时&#xff0c;需要使用vi编辑器&#xff0c;且在一个终端内&#xff0c;无法同时编辑多个文件。本节将介绍一较为实用…...

芯片设计重要工具—— IBM LSF 分布式高性能计算调度平台

IBM Spectrum LSF Suites 是面向分布式高性能计算 (HPC) 的工作负载管理平台和作业调度程序。基于 Terraform 的自动化现已可用&#xff0c;该功能可在 IBM Cloud 上为基于 IBM Spectrum LSF 的集群供应和配置资源。 借助我们针对任务关键型 HPC 环境的集成解决方案&#xff0…...