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

目录

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 xiaotaoset 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.rhkb.cn/news/437020.html

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

相关文章

人工智能 | 手工测试用例转Web自动化测试生成

简介 在传统编写 Web 自动化测试用例的过程中,基本都是需要测试工程师,根据功能测试用例转换为自动化测试的用例。市面上自动生成 Web 或 App 自动化测试用例的产品无非也都是通过录制的方式,获取操作人的行为操作,从而记录测试用…

大语言模型入门(一)——大语言模型智能助手

一、大语言模型智能助手 2022年末ChatGPT一经推出,一时间不注册个账号用一下都跟不上潮流了。然而,我们要注册OpenAI的账号使用ChatGPT还是一件比较麻烦的事情(懂的都懂)。好在,国内各大团队非常给力地及时推出了自研的…

php 平滑重启 kill -SIGUSR2 <PID> pgrep命令查看进程号

有时候我们使用nginx 大家都知道平滑重启命令: /web/nginx/sbin/nginx -s reload 但大家对php-fpm 重启 可能就是简单暴力的kill 直接搞起了 下面介绍一个sh 文件名保存为start_php.sh 来对php-fpm 进行平滑重启 #!/bin/bash# 检查 PHP-FPM 是否运行 if ! pgrep php-…

yolov11模型在bdd100k数据集上的应用【代码+数据集+python环境+训练/应用GUI系统】

yolov8/9/10/11模型在bdd100k数据集上的应用【代码数据集python环境训练/应用GUI系统】 yolov8/9/10/11模型在bdd100k数据集上的应用【代码数据集python环境训练/应用GUI系统】 yolov8/9/10/11模型在bdd100k数据集上的应用【代码数据集python环境训练/应用GUI系统】 bdd100k数据…

<<迷雾>> 第5章 从逻辑学到逻辑电路(5)--异或门 示例电路

!ABA!B 的逻辑电路组成 info::操作说明 鼠标单击开关切换开合状态 注: 这个实际就是 异或门, 当两个输入相异时输出高电平, 否则输出低电平 primary::在线交互操作链接 https://cc.xiaogd.net/?startCircuitLinkhttps://book.xiaogd.net/cyjsjdmw-examples/assets/circuit/cyj…

厦门网站设计的用户体验优化策略

厦门网站设计的用户体验优化策略 在信息化快速发展的今天,网站作为企业与用户沟通的重要桥梁,用户体验(UX)的优化显得尤为重要。尤其是在交通便利、旅游资源丰富的厦门,吸引了大量企业进驻。在这样竞争激烈的环境中&am…

推荐一个可以把PDF样本册转换为翻页电子书的网站

​随着互联网的普及,越来越多的企业和个人开始意识到线上展览的重要性。如何将实体样本册转化为线上版本,让更多人了解和欣赏自己的产品与服务? 一、网站简介 这款PDF样本册免费上传网站名为“FLBOOK”,致力于为广大用户提供便捷…

Windows暂停更新

目录 前言注册表设定参考 前言 不想Windows自动更新,同时不想造成Windows商店不可用,可以采用暂停更新的方案。 但是通过这里设定的时间太短了,所以我们去注册表设定。 注册表设定 win r 输入 regedit进入注册表 HKEY_LOCAL_MACHINE\SOFT…

【CKA】五、网络策略–NetworkPolicy

5、配置网络策略–NetworkPolicy 1. 考题内容: 2. 答题思路: 1、根据题目分析要创建怎样的网络策略 2、按题目要求查看ns corp-net的label 3、编写yaml,其中注意 namespace、label、port 3. 官网地址: https://kubernetes.io/…

大数据毕业设计选题推荐-个性化图书推荐系统-Python数据可视化-Hive-Hadoop-Spark

✨作者主页:IT毕设梦工厂✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、PHP、.NET、Node.js、GO、微信小程序、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇…

如何将精益思维应用于智能音箱的产品设计?

在激烈的市场竞争中,如何让自家的智能音箱脱颖而出,成为用户心中的“智能生活伴侣”?答案或许就藏在“精益思维”这一理念之中。本文,天行健精益生产顾问将带大家深入探索,如何将精益思维巧妙应用于智能音箱的产品设计…

[含文档+PPT+源码等]精品大数据项目-基于Django实现的高校图书馆智能推送系统的设计与实现

大数据项目——基于Django实现的高校图书馆智能推送系统的设计与实现背景,可以从以下几个方面进行详细阐述: 一、信息技术的发展背景 随着信息技术的飞速发展和互联网的广泛普及,大数据已经成为现代社会的重要资源。在大数据背景下&#xf…

【漏洞复现】JeecgBoot 积木报表 queryFieldBySql sql注入漏洞

》》》产品描述《《《 积木报表,是一款免费的企业级Web报表工具,像搭建积木一样在线设计报表!功能涵盖,数据报表、打印设计、图表报表、大屏设计等! 》》》漏洞描述《《《 JeecgBoot 积木报表 queryFieldBySq| 接口存在一个 SQL 注入漏洞&…

【递归】10. leetcode 111 二叉树的最小深度

题目描述 题目链接:二叉树的最小深度 2 解答思路 递归分为三步,接下来就按照这三步来思考问题 第一步:挖掘出相同的子问题 (关系到具体函数头的设计) 第二步:只关心具体子问题做了什么 (…

【鸿蒙】HarmonyOS NEXT应用开发快速入门教程之布局篇(上)

系列文章目录 【鸿蒙】HarmonyOS NEXT开发快速入门教程之ArkTS语法装饰器(上) 【鸿蒙】HarmonyOS NEXT开发快速入门教程之ArkTS语法装饰器(下) 【鸿蒙】HarmonyOS NEXT应用开发快速入门教程之布局篇(上) 文…

UDP校验和计算及网络中的校验和机制

UDP (User Datagram Protocol) 是一种无连接的传输层协议,它不像 TCP 那样提供可靠的传输保证。虽然 UDP 不保证数据可靠性,但它仍然提供了一个可选的校验和机制来检测数据在传输过程中出现的错误。 理解UDP校验和的计算过程和其在网络中的作用至关重要。…

遥感影像-语义分割数据集:云数据集详细介绍及训练样本处理流程

原始数据集详情 简介:该云数据集包括150张RGB三通道的高分辨率图像,在全球不同区域的分辨率从0.5米到15米不等。这些图像采集自谷歌Earth的五种主要土地覆盖类型,即水、植被、湿地、城市、冰雪和贫瘠土地。 KeyValue卫星类型谷歌Earth覆盖区…

振动分析:现成软件与LabVIEW开发之选

在振动分析应用中,选择现成软件还是使用LabVIEW进行定制开发,取决于具体需求、预算、技术支持和长期维护等因素。以下从多个角度分析两者的特点,为用户提供参考。 1. 现成软件的特点 现成软件(如LabVIEW振动分析工具包、MATLAB振…

Arduino UNO R3自学笔记17 之 Arduino为啥要用中断?

注意:学习和写作过程中,部分资料搜集于互联网,如有侵权请联系删除。 前言:学习Arduino中断的概念及其功能。 1.什么是中断? 单片机在执行程序时,发生一些其它紧急的事情,单片机将立即暂停当前…

2024年10月HarmonyOS应用开发者高级认证全新题库

注意事项:切记在考试之外的设备上打开题库进行搜索,防止切屏三次考试自动结束,题目是乱序,每次考试,选项的顺序都不同 新版题库:单选题40题 多选题20题 注意选项答案顺序不一样,大家记得看选项…