Redis中AOF数据持久化

AOF介绍

AOF(Append Only File)持久化:以独立日志的方式存储了 Redis 服务器的顺序指令序列,并只记录对内存进行修改的指令。
当Redis服务发生雪崩等故障时,可以重启服务并重新执行AOF文件中的指令达到恢复数据的目的。也就是说,通过重放(replay),来重新建立 Redis 当前实例的内存数据结构。这种模式有没有很熟悉,可以联想到MySQL主从同步时的relay log。
AOF的主要作用是解决了数据持久化的实时性,并且已经是Redis持久化的主流方式。

AOF实现日志记录

开启AOF日志记录

开启AOF日志记录:在redis.conf文件中,找到 APPEND ONLY MODE 设置

appendonly yes  # 默认不开启, 为 no

配置默认文件名:在redis.conf文件中设置

appendfilename “appendonly.aof”

 执行流程

流程如上图所示,我们解析如下:

1、将所有的写命令(set、hset)Append 到aof_buf缓冲区中

Redis 接收到 set keyName someValue 命令的时候,会先将数据写到内存,Redis 会按照如下格式写入 AOF 文件。

  1. *3:表示当前指令分为三个部分,每个部分都是 $ + 数字开头,后面是3部分的具体内容:指令、键、值。

  2. 数字:表示这部分的命令、键、值多占用的字节大小。比如 $3表示这部分包含 3 个字符,也就是 set 的长度。

2、AOF缓冲区根据策略向硬盘做sync同步

AOF为什么把命令append到aof_buf中,然后再进行同步?
这是因为Redis使用单进程响应命令,如果每次写AOF文件命令都直接持久化到硬盘,那么操作会是不是被间断,且性能完全取决于硬盘I/O负载。这个跟 MySQL 就没什么区别了。
先写入缓冲区aof_buf中,Redis可以提供多种缓冲区同步硬盘的策略,在性能、安全、数据可靠性方面做出平衡。

同步策略需关注以下几个配置:

 appendfsync 模式

appendfsync always  # 接受写命令后立即写入磁盘,强持久化但执行慢,不推荐appendfsync everysec # 每秒写入磁盘一次, 性能和持久化方面做了折中, 推荐appendfsync no  #  依赖操作系统自身同步的配置和策略,性能较佳,但是没法保证实时和完全持久化
no-appendfsync-on-rewrite
在 AOF 重写期间是否禁用 fsync。这可以提高重写性能,但可能会增加数据丢失的风险。
# 默认值:no# 可选值:yes 或 nono-appendfsync-on-rewrite yes

3、AOF文件Rewrite实现压缩 

 随着AOF文件越来越大,需要定期对AOF文件进行重写,达到压缩减负的目的,避免AOF文件过大导致性能和数据可靠性问题。
重写后的AOF文件变小的原因主要有以下几点:
3.1、进程内已超时的数据不再写入:在重写过程中,Redis不会将已经超时的数据写入新的AOF文件,这有助于减少不必要的数据记录。
3.2、删除无效命令:旧的AOF文件中可能包含无效的命令,如del key1hdel key2srem keysset a111等。重写过程会识别并删除这些无效命令,只保留最终数据的写入命令,从而减小了文件大小。
3.3、合并多条写命令:为了进一步优化AOF文件的大小,重写过程会将多条写命令合并为一个。例如,lpush list alpush list blpush list c可以合并为lpush list a b c。这种合并减少了命令的数量,进而减小了AOF文件的大小。
3.4、防止单条命令过大:对于某些操作类型(如list、set、hash、zset),为了防止单条命令过大造成客户端缓冲区溢出,重写过程会以64个元素为界拆分多条命令。虽然这在一定程度上可能增加了命令的数量,但它确保了每条命令的大小都在可控范围内,有助于维持整体文件大小的合理性。
总之AOF重写降低了文件占用空间,同时提升加载性能,因为更小的AOF 文件可以更快地被Redis加载。

AOF重写关注以下配置:
(1)、auto-aof-rewrite-percentage
触发 AOF 重写的增长百分比。例如,如果当前 AOF 文件大小是 100MB,并且这个值设置为 100,那么当 AOF 文件增长到 200MB 时,说明增长了100%,Redis 会尝试重写 AOF。

# 默认值:`100``auto-aof-rewrite-percentage 100`

(2)、auto-aof-rewrite-min-size

AOF 文件的最小大小,以便触发重写。即使 AOF 文件的增长百分比超过了 auto-aof-rewrite-percentage 设置的值,但如果文件大小小于这个值,Redis 也不会触发重写。​​​​​​​

# 默认值:`64mb`auto-aof-rewrite-min-size 64mb

4、故障重启时的数据恢复 

当Redis服务器重启时,可以加载AOF文件进行数据恢复。

流程如下:

  1. 当AOF和RDB文件同时存在时,优先加载AOF

  2. 若关闭了AOF(apendonly no),则加载RDB文件

  3. 加载AOF/RDB成功之后,redis重启成功。如果无相关的持久化,则直接启动成功。

  4. 如果AOF/RDB 数据恢复存在错误,则启动失败,并打印输出错误信息

RDB和AOF的比较和混合持久化 

现实情况下,无论使用RDB或者AOF都差点意思。使用 rdb 来恢复内存状态,势必会丢失一部分数据。使用 AOF 日志重放,重放对性能有一定的影响,而且在 Redis 实例很大的情况下,需要花费很长的时间。
Redis 4.0 解决了这个问题,才用了一个新的持久化模式——混合持久化,该混合模式默认是关闭状态的。
将 RDB 文件的内容和 rdb快照时间点之后的增量的 AOF 日志文件存在一起。这时候 AOF 日志不需要再是全量的日志,而是最近一次快照时间点之后到当下发生的增量 AOF 日志,通常这部分 AOF 日志很小。
所以执行有如下顺序:

  • 查找rdb内容,如果存在先加载 rdb内容再 重放剩余的 aof。

  • 没有rdb内容,直接以aof格式重放整个文件。
    这样快照就不用频繁的执行,同时由于 AOF 只需要记录最近一次快照之后的数据,不需要记录所有的操作,避免了出现单次重放文件过大的问题。

开启混合持久化模式:

aof-use-rdb-preamble yes

这个设置告诉Redis在AOF重写时使用混合持久化模式。当这个选项设置为yes时,重写后的AOF文件将包含RDB格式的数据前缀和AOF格式的增量修改操作。

总结

  • RDB提供了快照模式,记录某个时间的Redis内存状态。RDB设计了 bgsave 和写时复制,尽可能避免执行快照期间对读写指令的影响,但是频繁快照会给磁盘带来压力以及 fork 阻塞主线程。需把握频率。

  • AOF 日志存储了 Redis 服务的顺序指令序列,通过重放(replay)指令来写入日志文件,并通过写回策略来避免高频读写给Redis带来压力。

  • RDB快照的照片时间间隔,必然会带来数据缺失,如果允许分钟级别的数据丢失,可以只使用 RDB。

  • 如果只用 AOF,写回策略优先使用 everysec 的配置选项,因为它在可靠性和性能之间取了一个平衡。

  • 数据不能丢失时,内存快照和 AOF 的混合使用是一个很好的选择。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringMVC | SpringMVC中的 “数据绑定”

目录: “数据绑定” 介绍1.简单数据绑定 :绑定 “默认数据” 类型绑定 “简单数据类型” 类型 (绑定Java“基本数据类型”)绑定 “POJO类型”绑定 “包装 POJO”“自定义数据” 绑定 :Converter (自定义转换器) 2.复杂数据绑定 :绑定数组绑定集合 作者简…

ubuntu 18.04安装教程(详细有效)

文章目录 一、下载ubuntu 18.04镜像二、安装ubuntu1. 点击下载好的Vmware Workstation,点击新建虚拟机,选择 “自定义(高级)”,之后下一步。2. 默认配置,不需要更改,点击下一步。3. 选择 “安装程序光盘映像文件(iso)(…

Windows 11 DirectX 诊断工具获取电脑型号

Windows 11 DirectX 诊断工具获取电脑型号 1. dxdiag2. DirectX 诊断工具References 1. dxdiag Win R 打开运行窗口,输入 dxdiag,点击确定按钮。 2. DirectX 诊断工具 通过 DirectX 诊断工具,可以直接找到电脑型号,型号是硬件制…

RocketMQ学习笔记三(黑马)大神级

课程来源:6.RocketMQ安装_哔哩哔哩_bilibili (时长:19.5h) 讲解版本:4.5版本(我是以4.8版本实践的) 目录 第一部分 核心功能 第1章 RocketMQ的下载、安装、启动和测试(Linux环境) 启动: 测试: 第2章 RocketMQ集群搭建 2.1 集群特点 2.2 集群模式 2.3 双主…

程序员必备开发工具、程序员必备集成开发环境(IDE)

🌟 前言 欢迎来到我的技术小宇宙!🌌 这里不仅是我记录技术点滴的后花园,也是我分享学习心得和项目经验的乐园。📚 无论你是技术小白还是资深大牛,这里总有一些内容能触动你的好奇心。🔍 &#x…

Java项目:52 springboot基于SpringBoot的旅游网站的设计与实现013

作者主页:源码空间codegym 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 旅游网站主要功能如下: 1.用户管理:注册、登录、退出、修改密码; 2.分类显示:显示旅游路线的…

【机器学习300问】30、准确率的局限性在哪里?

一、什么是准确率? 在解答这个问题之前,我们首先得先回顾一下准确率的定义,准确率是机器学习分类问题中一个很直观的指标,它告诉我们模型正确预测的比例,即 还是用我最喜欢的方式,举例子来解释一下&#xf…

ISIS多区域实验简述

为支持大型路由网络,IS-IS在路由域内采用两级分层结构。 IS-IS网络中三种级别的路由设备:将Level-1路由设备部署在区域内,Level-2路由设备部署在区域间,Level-1-2路由设备部署在Level-1和Level-2路由设备的中间。 实验拓扑图&…

107. 如何使用Docker以及Docker Compose部署Go Web应用

文章目录 一、为什么需要Docker?二、Docker部署示例1. 准备代码2. 创建Docker镜像3. 编写Dockerfile4. Dockerfile解析5. 构建镜像6. 通过镜像创建容器运行 三、分阶段构建示例四、附带其他文件的部署示例五、关联其他容器六、Docker Compose模式七、总结 本文将介绍…

微信小程序(五十二)开屏页面效果

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.使用控件模拟开屏界面 2.倒计时逻辑 3.布局方法 4.TabBar隐藏复现 源码&#xff1a; components/openPage/openPage.wxml <view class"openPage-box"><image src"{{imagePath}}"…

java-类和对象

1.面向对象 1.1 区分面向对象与面向过程 举个例子: 在传统的洗衣服过程中,需要经历防水,放衣服,放洗衣粉,搓洗,换水......多个步骤,每个过程都是不可或缺的,关注的是过程. 而现在的洗衣服过程,就需要我们把衣服,洗衣粉放入洗衣机,启动洗衣机即可,并不需要关注洗衣机是如何运行…

React-嵌套路由

1.概念 说明&#xff1a;在一级路由中又内嵌了其他路由&#xff0c;这种关系就叫做嵌套路由&#xff0c;嵌套至一级路由内的路由又称作二级路由。 2.实现步骤 说明&#xff1a;使用childen属性配置路由嵌套关系&#xff0c;使用<Outlet/>组件配置二级路由渲染的位置。…

事务【MySQL】

事务的概念 引入 在 A 转账 100 元给 B 的过程中&#xff0c;如果在 A 的账户已经减去了 100 元&#xff0c;B 的账户还未加上 100 元之前断网&#xff0c;那么这 100 元将会凭空消失。对于转账这件事&#xff0c;转出和转入这两件事应该是绑定在一起的&#xff0c;任意一个动…

B3620 x 进制转 10 进制(详解)

题目 思路 八进制数567怎么转化为十进制数。首先八进制就是逢八进一&#xff0c;也就是说这里面最大的数也就7&#xff0c;没有≥8的数。下面我们就讲一下567怎么转化为十进制&#xff1a;首先7是个位&#xff0c;可以直接写成十进制的7&#xff0c;6是十位&#xff0c;它是通…

Java项目企业设备管理系统

java项目企业设备管理系统javaweb项目ssm框架项目 运行环境:idea/eclipse tomcat jdk mysql navicat 系统用户分为员工和管理员两类用户。两类用户都可以进行系统的登录&#xff0c;虽然进入的系统主页结构相似&#xff0c;但是在功能上有不同。员工的密码可以自己进入系统后…

城乡居民基本医疗信息管理系统|基于Springboot的城乡居民基本医疗信息管理系统设计与实现(源码+数据库+文档)

城乡居民基本医疗信息管理系统目录 目录 基于Springboot的城乡居民基本医疗信息管理系统设计与实现 一、前言 二、系统设计 三、系统功能设计 1、病例管理 2、医院资讯信息管理 3、医院资讯类型管理 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选…

蓝桥杯历年真题省赛java b组2016年第七届

一、题目 取球博弈 两个人玩取球的游戏。 一共有N个球&#xff0c;每人轮流取球&#xff0c;每次可取集合{n1,n2,n3}中的任何一个数目。 如果无法继续取球&#xff0c;则游戏结束。 此时&#xff0c;持有奇数个球的一方获胜。 如果两人都是奇数&#xff0c;则为平局。 假设双…

BugKu刷题日记(web)一

文章目录 lfi题目页面恶意构造解题思路 Whois题目页面恶意构造解题思路 lfi 来源&#xff1a;https://ctf.bugku.com/challenges/detail/id/429.html 漏洞类型&#xff1a;文件包含漏洞 同类型BugKu&#xff1a;baby ifi、baby ifi 2 题目页面 恶意构造 http://example.com/…

程序人生——Java数组和集合使用建议(1)

目录 引出数组和集合建议60&#xff1a;性能考虑&#xff0c;数组是首选建议61&#xff1a;若有必要&#xff0c;使用变长数组建议62&#xff1a;警惕数组的浅拷贝 建议63&#xff1a;在明确的场景下&#xff0c;为集合指定初始容量建议64&#xff1a;多种最值算法&#xff0c;…

C++ 作业 24/3/14

1、成员函数版本实现算术运算符的重载&#xff1b;全局函数版本实现算术运算符的重载 #include <iostream>using namespace std;class Test {friend const Test operator-(const Test &L,const Test &R); private:int c;int n; public:Test(){}Test(int c,int n…