【Redis】Redis中的 AOF(Append Only File)持久化机制

news2024/10/1 19:30:44

目录

1、AOF日志

2、AOF 的执行顺序与潜在风险

3、如何优化 AOF?(写入策略)

4、AOF重写机制(防止日志文件无限增长)

1、AOF日志

        想象一下,Redis 每次执行写操作的时候,都把这些操作以追加的方式写入一个文件中,然后当你重启 Redis 时,Redis 会从这个文件里读取命令并重新执行,这样就相当于恢复了缓存的数据。这就是 Redis 的 AOF 持久化功能——它专门用来记录写操作(读操作是不会记录的,因为读操作没必要重放)。

        默认情况下,AOF 是关闭的(Redis 6.0 之后已经默认是开启了)。如果你想用它,需要去修改 Redis 的配置文件 redis.conf,把相应的参数打开。只有同步到磁盘中才算持久化保存了,否则依然存在数据丢失的风险,比如说:系统内核缓存区的数据还未同步,磁盘机器就宕机了,那这部分数据就算丢失了。

# 是否开启 AOF 持久化 (默认值: no)
# 改为 yes 表示开启 AOF 持久化功能
appendonly yes

# AOF 持久化文件的名称 (默认值: appendonly.aof)
# 可以自定义 AOF 文件的名称
appendfilename "appendonly.aof"

        AOF 日志就是一个普通的文本文件,里面记录的都是命令,比如执行 set name xiaotao,日志里的内容大概是这样的:

*3
$3
set
$4
name
$7
xiaotao

        这些奇怪的符号看上去可能有点复杂,其实很好理解。*3 表示这个命令由三部分组成,每部分的内容前都有一个 $ 和一个数字,比如 $3 后面是 set,意思是这个部分的内容有 3 个字节(也就是 set 这个命令有 3 个字符)。

2、AOF 的执行顺序与潜在风险

执行顺序:Redis 先执行写操作,再把命令记录到 AOF 日志里,这样做有两个好处:

  1. 避免额外的检查开销:如果先写日志再执行命令,可能会把错误的命令写进日志,那在数据恢复时就会出错。先执行命令再记录日志,确保写进日志的命令都是正确的。
  2. 减少写操作的阻塞:因为日志是在命令成功执行后才写入的,所以不会影响当前的写操作。

潜在风险:虽然 AOF 很强大,但也有一些风险:

  1. 数据丢失风险:因为写命令和写日志是两个步骤,如果 Redis 还没来得及把命令写入日志就宕机了,这部分数据就会丢失。
  2. 阻塞风险:写日志的操作是在主进程完成的,如果硬盘压力大,写日志的速度变慢,就可能阻塞后续的命令执行。

3、如何优化 AOF?(写入策略)

        在 Redis 中,AOF 是通过一种「先缓存、后写盘」的方式来保存数据。写操作完成后,命令会被追加到 server.aof_buf 缓冲区中,然后通过 write() 系统调用将缓冲区数据写入 AOF 文件。不过,数据并没有直接写到硬盘,而是暂时放在操作系统的内核缓冲区(page cache)中,之后由操作系统决定什么时候把这些数据写入硬盘。

        AOF潜在风险的本质都跟 AOF 日志什么时候写入硬盘有关。所以 Redis 提供了几种不同的写入策略,由 redis.conf 配置文件中的 appendfsync 配置项控制,你可以根据需求来调整。这三种策略是:

(一)always(总是)

  • 含义:每次写操作命令执行完后,立即将 AOF 日志数据写入硬盘。
  • 优点:数据几乎不会丢失,因为每次操作都会马上保存到硬盘。
  • 缺点:性能最差,因为频繁的硬盘操作会拖慢 Redis 的主进程。

(二)everysec(每秒)

  • 含义:写操作执行后,命令会先被写入到 AOF 文件,但每隔一秒才同步到硬盘。
  • 优点:在性能和数据安全之间做了折中,减少了频繁写盘带来的性能损耗,同时每秒进行一次写盘,丢失数据的风险也相对较小。
  • 缺点:如果 Redis 在这 1 秒内宕机,最后的写操作数据可能会丢失。

(三)no(不控制)

  • 含义:不由 Redis 控制写盘时机,而是交给操作系统处理,数据写入内核缓冲区后,操作系统会自行决定什么时候写入硬盘。
  • 优点:性能最好,因为 Redis 不会干涉写盘,减少了 Redis 主进程的负担。
  • 缺点:数据丢失的可能性更大,因为操作系统决定写入的时机不可预知,如果宕机,可能会丢失大量数据。

三种策略的优缺点对比

策略数据安全性性能表现适用场景
always数据最安全,几乎不丢失性能最差适合要求高可靠性的数据存储场景
everysec数据丢失量最多 1 秒性能较好,折中方案大多数场景适用,平衡性能和数据丢失风险
no可能丢失较多数据性能最好适合高性能要求,不介意数据丢失的场景

所以要根据场景来选择写入策略

  • 如果你的系统对性能要求高,可以选择 no 策略,最大化提升 Redis 的执行效率。
  • 如果你不能容忍任何数据丢失,那就选择 always 策略,确保每次操作都立即写入硬盘。
  • 对大多数业务场景来说,everysec 是一个比较好的折中选择:它既能保持不错的性能,又能在保证数据安全方面做得比较好,只是可能会丢失 1 秒内的数据。

4、AOF重写机制(防止日志文件无限增长)

        在 Redis 中,AOF 持久化会不断记录写操作命令到一个文件中,随着时间的推移,这个文件的大小会越来越大。如果 AOF 文件太大,可能会带来一些问题,例如性能问题:文件越大,Redis 重启时需要花费更多时间去读取 AOF 文件以恢复数据,导致恢复速度变慢。

        为了解决这个问题,Redis 提供了 AOF 重写机制,当 AOF 文件超过设定的阈值后,Redis 会自动对 AOF 文件进行压缩。

(一)AOF 重写的原理:

        AOF 重写机制是在重写时,读取当前数据库中的所有键值对,然后将每一个键值对用一条命令记录到「新的 AOF 文件」,等到全部记录完后,就将新的 AOF 文件替换掉现有的 AOF 文件。所以,AOF 重写机制并不是直接修改现有的 AOF 文件,而是创建一个新的 AOF 文件,这个新的文件会根据当前 Redis 数据库的状态来生成。

  • 从数据库读取当前状态:重写时,Redis 会读取当前数据库中的所有键值对。
  • 记录最新状态:然后,每个键值对只会用一条命令记录到新的 AOF 文件中。这就避免了历史的命令积累,只记录当前的最新数据状态。

举个例子:

        假设在没有重写之前,我们执行了两条命令:

set name xiaotao

set name xiaotaostudy

        这两条命令会依次被记录到 AOF 文件中。但是在 AOF 重写之后,Redis 会只保留最新的键值对状态,即用一条命令 set name xiaotaostudy 来替换之前的两条命令。因为第一条命令已经是历史命令,最新的值已经覆盖掉它了,没必要保留。

        通过这种方式,AOF 文件的体积大大减少了,因为它只保存了数据的最终状态,而不是所有的修改历史。

重写到新的 AOF 文件中,而不是直接对旧 AOF 文件修改的好处

  • 数据安全:如果重写过程中发生了错误,比如进程挂了,现有的 AOF 文件不会被影响,因为 Redis 还没有用新的文件替换它。
  • 避免污染现有文件:如果直接修改现有文件,一旦发生错误,文件可能会损坏,无法用于数据恢复。

(2)重写期间的同步机制

        由于 AOF 重写涉及到大量的写入操作,直接在主进程中进行重写可能会影响 Redis 处理命令的效率。为了避免这种情况,Redis 将 AOF 重写的操作放在子进程中执行,主进程继续处理正常的命令请求。

  • AOF 重写缓冲区:当子进程创建新的 AOF 文件时,Redis 主进程会将所有新执行的写命令记录到一个叫做 AOF 重写缓冲区的地方。这是为了确保在重写过程中,数据的修改不会丢失。
  • 同步数据:当子进程完成新的 AOF 文件创建后,Redis 会把重写期间存放在缓冲区的写命令追加到新的 AOF 文件末尾。这确保了新文件和当前数据库的状态完全一致。
  • 文件替换:新 AOF 文件创建完成并同步后,Redis 将旧的 AOF 文件替换为新的文件,完成整个重写过程。

(三)手动或自动触发 AOF 重写

  • 手动触发:你可以通过 BGREWRITEAOF 命令手动执行 AOF 重写。

  • 自动触发:Redis 还支持自动触发 AOF 重写,通过配置以下两个参数实现:

    1. auto-aof-rewrite-min-size:AOF 文件的最小触发大小。只有当文件大小超过这个值时,才会触发重写。默认值是 64 MB。

    2. auto-aof-rewrite-percentage:AOF 文件大小增长百分比。如果当前 AOF 文件的大小相较于上一次重写后的文件大小,增加了设定的百分比值,Redis 会触发自动重写。默认是 100%,表示文件大小翻倍时重写。

推荐: 

【MySQL】常见的SQL优化方式(二)-CSDN博客icon-default.png?t=O83Ahttps://blog.csdn.net/m0_65277261/article/details/142610165?spm=1001.2014.3001.5501【MySQL】常见的SQL优化方式(一)_mysql优化-CSDN博客icon-default.png?t=O83Ahttps://blog.csdn.net/m0_65277261/article/details/142376280?spm=1001.2014.3001.5501

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot项目 | 瑞吉外卖 | 短信发送验证码功能改为免费的邮箱发送验证码功能 | 代码实现

0.前情提要 之前的po已经说了单独的邮箱验证码发送功能怎么实现: https://blog.csdn.net/qq_61551948/article/details/142641495 这篇说下如何把该功能整合到瑞吉项目里面,也就是把原先项目里的短信发送验证码的功能改掉,改为邮箱发送验证…

World of Warcraft [CLASSIC][80][Grandel] /console cameraDistanceMaxZoomFactor 2

学习起来!!! 调整游戏界面镜头距离,默认值为:2 /console cameraDistanceMaxZoomFactor 2 大于4,效果不明显了,鼠标滚轮向后滚,拉起来镜头 World of Warcraft [CLASSIC][80][Grandel…

Another redis desktop manager使用说明

Another redis desktop manager使用说明 概述界面介绍图示说明连接界面设置界面查看操作日志主界面信息进入redis-cli控制台更多 概述 Another Redis Desktop Manager是一个开源的跨平台 Redis 客户端,提供了简洁易用的图形用户界面(GUI)&am…

第5篇:勒索病毒自救指南----应急响应篇

经常会有一些小伙伴问:中了勒索病毒,该怎么办,可以解密吗? 第一次遇到勒索病毒是在早几年的时候,客户因网站访问异常,进而远程协助进行排查。登录服务器,在站点目录下发现所有的脚本文件及附件…

【JaveEE】——多线程中使用顺序表,队列,哈希表

阿华代码,不是逆风,就是我疯 你们的点赞收藏是我前进最大的动力!! 希望本文内容能够帮助到你!! 目录 一:多线程环境使用ArrayList 引入: 1:顺序表使用同步机制 2&…

Linux服务器配置anaconda3,下载torch

如图,vscode连接远程服务器后,如下所示: 下载 Anaconda 下载及安装 进入下载官网,点击linux, 下载方式有两种, 直接下载安装包,下载完上传服务器,并安装,安装执行b…

【算法系列-链表】移除链表元素

【算法系列-链表】移除链表元素 欢迎来到【算法系列】第二弹 🏆 链表,接下来我们将围绕链表这类型的算法题进行解析与练习!一起加油吧!!( •̀ ω •́ )✧✨ 文章目录 【算法系列-链表】移除链表元素1. 算法分析&am…

Spring Data(学习笔记)

JPQL语句???(Query括号中的就是JPQL语句) 怎么又会涉及到连表查询呢? 用注解来实现表间关系。 分页是什么?为什么什么都有分页呢 ? 继承,与重写方法的问题 Deque是什么 ?…

线程池:线程池的实现 | 日志

🌈个人主页: 南桥几晴秋 🌈C专栏: 南桥谈C 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据…

C++容器之vector模拟实现(代码纯享版!!!)

目录 前言 一、头文件 .h文件 总结 前言 本文是模拟实现vector部分功能的代码&#xff0c;可以直接拿去使用 一、头文件 .h文件 #include<assert.h> #include<iostream> using namespace std; namespace zz {template<class T>class vector{public:typedef…

C++ set,multiset与map,multimap的基本使用

1. 序列式容器和关联式容器 string、vector、list、deque、array、forward_list等STL容器统称为序列式容器&#xff0c;因为逻辑结构为线性序列的数据结构&#xff0c;两个位置存储的值之间一般没有紧密的关联关系&#xff0c;比如交换一下&#xff0c;他依旧是序列式容器。顺…

STM32器件支持包安装,STLINK/JLINK驱动安装

一、支持包安装 1、离线安装 先下载支持包之后&#xff0c;再进行安装。如下图要安装STM32F1系列&#xff0c;双击 出现如下&#xff0c;会自动锁定安装路径&#xff0c;然后点击下一步&#xff0c;直接安装。 2、在线安装 首先需要电脑联网。如下。先点击第一个红框绿色按钮…

常见的VPS或者独立服务器的控制面板推荐

随着越来越多的企业和个人转向VPS和独立服务器以获得更高的性能和灵活性&#xff0c;选择合适的控制面板变得尤为重要。一个好的控制面板可以大大简化服务器管理&#xff0c;提高工作效率。本篇文章将介绍2024年最值得推荐的VPS控制面板&#xff0c;帮助您做出明智的选择。 1.…

STL容器适配器

欢迎来到本期节目- - - STL容器适配器 适配器模式&#xff1a; 在C中&#xff0c;适配器是一种设计模式&#xff0c;有时也称包装样式&#xff1b; 通过将类自己的接口包裹在一个已存在的类中&#xff0c;使得因接口不兼容而不能在一起工作的类能在一起工作&#xff1b; 也就…

使用VBA快速生成Excel工作表非连续列图片快照

Excel中示例数据如下图所示。 现在需要拷贝A2:A15,D2:D15,J2:J15,L2:L15,R2:R15为图片&#xff0c;然后粘贴到A18单元格&#xff0c;如下图所示。 大家都知道VBA中Range对象有CopyPicture方法可以拷贝为图片&#xff0c;但是如果Range对象为非连续区域&#xff0c;那么将产生10…

详解DHCP服务工作原理及配置案例

一. DHCP概述 DHCP&#xff08;Dynamic Host Configuration Protocol&#xff0c;动态主机配置协议&#xff09;是一个主机IP简化分配管理的TCP/IP协议&#xff0c;用户通过DHCP服务器动态的分配给客户端IP地址及其他环境的配置工作&#xff0c;包括IP地址、子网掩码、网关和…

【NVIDIA】如何使用nvidia-smi命令管理和监控GPU

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…

KPConv: Flexible and Deformable Convolution for Point Clouds

Abstract Kernel Point Convolution&#xff08;KPConv&#xff09;是一种点云卷积方法&#xff0c;它可以直接在点云数据上进行操作&#xff0c;无需任何中间的表示形式。方法的核心在于使用核点来定义卷积权重&#xff0c;核点位于欧几里得空间中&#xff0c;并仅对靠近它们…

Spring DI 笔记

目录 1.什么是DI? 2.依赖注入的三种⽅式 2.1属性注⼊ 2.2构造⽅法注⼊ 2.3Setter 注⼊ 2.4三种注⼊优缺点分析 3.Autowired存在问题 1.什么是DI? DI: 依赖注⼊ 依赖注⼊是⼀个过程&#xff0c;是指IoC容器在创建Bean时, 去提供运⾏时所依赖的资源&#xff0c;⽽资源指的…

(JAVA)浅尝关于 “栈” 数据结构

1. 栈的概述&#xff1a; 1.1 生活中的栈 存储货物或供旅客住宿的地方&#xff0c;可引申为仓库、中转站。例如酒店&#xff0c;在古时候叫客栈&#xff0c;是供旅客休息的地方&#xff0c;旅客可以进客栈休息&#xff0c;休息完毕后就离开客栈 1.2计算机中的栈 将生活中的…