redis AOF机制

news2024/11/29 0:45:35

在这里插入图片描述
在redis运行期间,不断将redis执行的写命令写到文件中,redis重启之后,只要将这些命令重复执行一遍就可以恢复数据。因为AOF只是将少量的写命令写入AOF文件中,因此其执行效率高于RDB,开启AOF即使Redis发生故障,丢失的数据也较少。

appendonly yes
appendfilename appendonly.aof

aof重写:随着命令不断添加aof文件会越来越大,redis会进行aof的重写,每个健只会写入最后一次命令,已删除或过期的数据相关命令将抹去。

  1. AOF定时逻辑
    1. 判断是否存在AOF重写操作,若当前没有子进程则执行AOF重写操作
    2. AOF重写条件
      1. AOF文件大于server.aof_rewrite_min_size
      2. 上次AOF重写后的文件大小,当前AOF文件增加的空间大小比例已经超过了server.aof_rewrite_perc配置,此配置默认为100.例如上次重写aof大小为80MB,现在aof文件有160了,则满足重写要求。
    3. 存在延迟的AOF缓冲区刷新操作,则将数据从缓冲区刷到文件中。
    4. 每经过一段时间,执行:若上次AOF缓冲区刷新操作中写入磁盘出错,则再次刷新缓冲区
  2. AOF持久化过程
    1. 命令传播
      1. 对带EXPIRE、EXPIREAT、PEXPIRE、SETEX、PSETEX,或者带EX、PX选项的SET命令做特殊处理。因为这些命令带有过期时间,需要将这些命令转换为PEXPIREAT命令,将过期时间的时间戳写入buf暂存区。
      2. 对于其他命令将命令写入buf暂存区
      3. 若服务器开启AOF功能,则将buf暂存区内容写入AOF缓冲区
      4. 如果当前线程正在执行AOF重写操作,则还需将buf暂存区内容写入到AOF重写缓冲区
    2. 刷新AOF缓冲区
      1. 当AOF缓冲区为空时,如果刷盘策略为每秒同步,且当前存在待同步的数据,距上次同步已经过去一秒,则开始同步。否则退出。
      2. 检查后台线程是否正在执行同步操作,若存在则执行以下逻辑:若同步策略为每秒同步,则延迟AOF缓冲区刷新操作。如果已经延迟多次且延迟时间超过2秒,则强制刷新AOF缓冲区。
      3. 将AOF缓冲区内容写入文件
      4. aof缓冲区内容刷新成功后,若aof总空间小于4kb,则清空并重用aof缓冲区,否则新建一个新的缓冲区。
    3. 同步磁盘
      1. 刷盘策略:
        1. 不执行fsync,速度快的安全性低
        2. 执行fsync,安全性高速度慢
        3. 每个一秒执行fsync,折中处理
      2. 如果程序存在子进程,且开了server.aof_no_fsync_on_rewrite配置,就不同步磁盘
      3. 若刷盘策略是每次同步(2),则开始同步磁盘
      4. 若刷盘策略为每秒同步,且距上次同步已经过去一秒,则添加一个后台任务同步磁盘
  3. AOF重写
    1. aof混合持久化
      1. 若开启混合持久化,在AOF重写时,会将redis数据以RDB格式保存到新文件中,再将重写缓冲区增量写命令以aof格式写入文件。
    2. 重写过程:
      1. fork一个子进程(aof进程),负责将当前内存数据保存到一个新文件中
        1. 打开一个临时文件并初始化rio变量
        2. 若开启了aof持久化,则生成rdb文件到临时文件中,否则将redis数据转化为写入命令写入临时文件
        3. 重复从server.aof_pipe_read_data_from_parent读取增量命令:
          1. 读取时间超过一秒或者连续20毫秒没有读取到则停止
          2. 若没有读取到增量命令则阻塞一秒等待增量命令
        4. 通知主进程(父进程)停止发送增量命令
        5. 再一次从server.aof_pipe_read_data_from_parent读取增量命令
        6. 将暂存区内容写入文件并同步磁盘
        7. 重命名文件
      2. 将步骤一执行期间的增量命令写入新文件中
      3. 主进程收尾,将步骤二执行期间主进程执行的赠礼命令写入新文件中,替换新的AOF文件
        1. 打开aof进程创建的文件
        2. 将重写缓冲区内容写入临时文件
        3. 重命名文件进行替换
        4. 磁盘同步并清空server.aof_buf内容
  4. AOF文件加载
    1. 打卡aof文件
    2. 创建一个伪客户端,执行aof文件中的命令
    3. 如果文件以redis标志开头,则该aof文件是混合持久化方式生成,需调用处理RDB内容的函数加载RDB内容
    4. 处理aof文件中的命令
    5. 按照RESP协议格式,读取命令参数数量
    6. 读取每一个参数
    7. 查找命令redisCommand
    8. 调用redisCommand.proc执行命令

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

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

相关文章

Redis缓存场景

Redis缓存场景 文章目录 Redis缓存场景Redis做缓存旁路缓存缓存异常缓存穿透缓存击穿缓存雪崩 缓存一致性先写缓存再写数据库先写数据库再写缓存先删除缓存再写数据库先写数据库再删缓存缓存双删Binlog异步更新总结 Redis做缓存 部分图解来自于:https://www.miansh…

微课录制不再难:精选三款录屏软件助你一臂之力

在这个信息爆炸的时代,微课以其短小精悍、易于消化的特点,成为知识传播的新宠。无论是教师备课、企业培训,还是个人知识分享,微课都能以其独特的方式,让学习变得更加高效和便捷。在数字化教学的浪潮中,PPT课…

SAP SUBSCREEN使用

step1:在SELECTION-SCREEN中定义SUBSCREEN SELECTION-SCREEN BEGIN OF SCREEN 0101 AS SUBSCREEN. SELECT-OPTIONS S_XMGS FOR ZTPO0074-XMGS . SELECTION-SCREEN END OF SCREEN 0101.STEP2: 引用SUBSCREEN 关键字 CALL SUBSCREEN SUBSCR_0100 INCLUDING SY-RE…

Java基础核心知识学习笔记

方法重载 请记住下面重载的条件 方法名称必须相同。参数列表必须不同(个数不同、或类型不同、参数类型排列顺序不同等)。方法的返回类型可以相同也可以不相同。仅仅返回类型不同不足以成为方法的重载。重载是发生在编译时的,因为编译器可以根…

结合ChatGPT与Discord,提高团队合作效率

本文将教你如何集成Discord Bot,助力团队在工作中实现更高效的沟通与协作。通过充分发挥ChatGPT的潜力,进一步提升工作效率和团队协作能力。无需编写任何代码即可完成本文所述的操作,进行个性化定制只需对参数进行微调即可。 方案介绍 如果在…

联想闪电鲨移动硬盘文件没删除却消失了怎么办

在日常的数据存储与管理中,移动硬盘作为便携且容量可观的存储设备,深受用户青睐。然而,当您发现联想闪电鲨移动硬盘中的文件突然消失,而您确信并未进行删除操作时,这无疑会令人感到困惑与焦虑。本文旨在为您揭开这一谜…

MySQL各个版本root账号没有最高权限的解决方法

一、详细报错 ERROR 1045 (28000): Access denied for user ‘root’‘localhost’ (using password: YES) 报错原因(分析过程): rootlocalhost用户密码修改导致 解决方法: 跳过权限验证启动数据库,并修改密码。如下…

[028-3].第05节:RabbitMQ中的交换机

1.什么是Exchanges(交换机): 1.RabbitMQ 消息传递模型的核心思想是: 生产者生产的消息从不会直接发送到队列。实际上,通常生产者甚至都不知道这些消息传递传递到了哪些队列中2.生产者只能将消息发送到交换机(exchange),交换机工作的内容非常…

C++ TinyWebServer项目总结(7. Linux服务器程序规范)

进程 PID 进程的PID(Process ID)是操作系统中用于唯一标识一个进程的整数值。每个进程在创建时,操作系统都会分配一个唯一的PID,用来区分不同的进程。 PID的特点 唯一性: 在操作系统运行的某一时刻,每个…

江苏省第二中医院案例│“互联网+医疗”下的灾备建设

江苏省第二中医院,成立于1988年12月,是一所融医疗、教学、科研、预防保健为一体的公立省级综合性三级甲等中医院。目前,正对照“大学附属医院”“省级三甲医院”建设标准,全面推进医院建设高质量跨越式发展。 用户需求&#xff1a…

冒 泡 排 序

今天咱们单独拎出一小节来聊一聊冒泡排序昂 冒泡排序的核心思想就是:两两相邻的元素进行比较(理解思路诸君可看下图) 接下来我们上代码演示: 以上就是我们初步完成的冒泡排序,大家不难发现,不管数组中的元…

智能停车计费系统设计与实现_urqs9

TOC springboot552智能停车计费系统设计与实现_urqs9--论文 绪 论 1.1 研究背景 在新世纪的今天,计算机已经发展到一定的规模,带动了国内经济和科学技术的快速发展,科学技术的发展大大提高了生产效率,使人们的物质生活需求得到…

为啥每个语音的printf(“%d%d%d%d“,i,j,i++,j++)不一样

题目来源一位考研同学的题目。 第一眼:小子,这都不会😀 第二眼:wok,咋没有选项😢 作为一个大一学C语音,大二学Java的同学来说,我一看就觉得肯定是11 6 11 6 。 结果很遗憾&#xff0…

微服务开发相关问题

微服务开发相关问题 服务注册nacos 2.X注册问题[Nacos Config] config[dataIddatasource.yml, groupDEFAULT_GROUP] is empty 参考 持续更新… 服务注册 nacos 2.X注册问题 [Nacos Config] config[dataIddatasource.yml, groupDEFAULT_GROUP] is empty 因为:# 由于…

C++第十二弹 -- STL之list模拟实现

文章索引 前言模拟实现list1. ListNode节点类2. list的迭代器封装3. 反向迭代器4. list类的模拟实现测试代码 list的反向迭代器总结 前言 通过模拟实现可以让我们更加深刻的理解C底层STL的实现逻辑, 本篇就对list的底层进行模拟实现. 博客主页: 酷酷学!!! 点击关注 共同进步!…

影响五金精密零件加工价格的因素

在制造业中,五金精密零件的加工价格受到多种因素的影响。了解这些因素,对于企业合理控制成本、选择合适的加工供应商至关重要。 首先,零件的设计复杂度是一个重要因素。复杂的设计通常需要更先进的加工技术和更多的加工工序。例如&#xff0c…

intel ECI作为ACRN VM使用dpdk(vfio和iommu问题)以及img扩容

ACRN虚拟机内IOMMU 对非虚拟机而言,只要在BIOS里开启VT-d就可以用iommu去映射vfio使用DPDK,但是在虚拟机中即便BIOS开启了VT-d,它也传不到VM中。因此这个帖子解决一下这个问题。 在ACRN的launch脚本中需要passthru两个网卡,一个用…

C++ TinyWebServer项目总结(8. 高性能服务器程序框架)

《Linux 高性能服务器编程》一书中,把这一章节作为全书的核心,同时作为后续章节的总览。这也意味着我们在经历了前置知识的学习后,正式进入了 Web 服务器项目的核心部分! 前置内容回顾: 1. C TinyWebServer项目总结&…

《深入浅出多模态》(九)多模态经典模型:MiniGPT-v2、MiniGPT5

🎉AI学习星球推荐: GoAI的学习社区 知识星球是一个致力于提供《机器学习 | 深度学习 | CV | NLP | 大模型 | 多模态 | AIGC 》各个最新AI方向综述、论文等成体系的学习资料,配有全面而有深度的专栏内容,包括不限于 前沿论文解读、资料共享、行业最新动态以、实践教程、求职…

【Datawhale AI夏令营第四期】 浪潮源大模型应用开发方向笔记 Task03 大咖项目分享 人话八股文Bakwaan_Buddy项目开发尝试

【Datawhale AI夏令营第四期】 浪潮源大模型应用开发方向笔记 Task03 人话八股文Bakwaan_Buddy项目开发尝试 Idea: 我们草台班子目前的想法是解决大家计算机学院毕业面临的BUG——不爱背、背不下来八股文,觉得枯燥、烦、工作了用不着,反正就是知识他不…