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

【学习笔记】Redis-AOF日志重写的机制

目录

      • 前言
      • 1. 触发机制
      • 2. 子进程执行
      • 3. 写入与同步
      • 4. 安全保障
      • 5. 潜在问题与优化

前言

AOF(Append Only File)日志重写是Redis中一种优化持久化文件大小和提高数据恢复效率的机制。以下是AOF日志重写的具体机制和步骤:

1. 触发机制

AOF重写可以通过手动触发或自动配置触发:

  • 手动触发:通过执行BGREWRITEAOF命令来启动重写过程。
  • 自动触发:Redis配置文件(redis.conf)中可以通过auto-aof-rewrite-percentageauto-aof-rewrite-min-size来设置,当AOF文件增长到一定比例或超过最小尺寸时自动触发重写。

2. 子进程执行

  • BGREWRITEAOF命令被执行时,Redis会通过fork操作创建一个子进程。这个过程几乎是瞬时的,因为操作系统使用了写时复制(Copy-On-Write)技术。
  • 父进程继续处理客户端的命令请求,新接收的命令会被正常追加到现有的AOF文件中。
  • 子进程则开始遍历内存中的数据结构,将当前数据库状态转换成一系列重建数据库所需的写命令序列,写入到一个新的临时AOF文件中。

3. 写入与同步

  • 子进程在构建新的AOF文件时,会尽可能地优化命令序列,比如使用多条命令的合并命令(如SET多个键值对)来减少文件大小。
  • 一旦重写完成,子进程会向父进程发送一个信号,并提供新AOF文件的路径。
  • 父进程收到信号后,会执行以下操作:
    • 使用新生成的AOF文件替换老的AOF文件。
    • 从这一刻起,新的写操作直接写入到新的AOF文件中。

4. 安全保障

  • 在重写期间,如果发生故障(如服务器崩溃),Redis能够通过老的AOF文件保证数据的完整性,因为新的AOF文件只有在完全替换老文件后才开始使用。
  • Redis还提供了aof-use-rdb-preamble配置选项,允许在AOF文件的开头写入RDB格式的快照,进一步加快了故障恢复速度。

5. 潜在问题与优化

  • 磁盘I/O压力:AOF重写和常规的AOF追加操作可能对磁盘造成较大压力,尤其是在高负载环境下。
  • 阻塞风险:尽管AOF重写由子进程完成,理论上不会阻塞主进程,但如果磁盘I/O饱和,可能会间接影响到主进程处理命令的速度。

相关文章:

  • 【AI论文与新生技术】Follow-Your-Emoji:精细可控且富有表现力的自由式人像动画技术
  • 【深度学习】目标检测,Faster-RCNN算法训练,使用mmdetection训练
  • Spring boot项目
  • 商城项目【尚品汇】07分布式锁-2 Redisson篇
  • npm发布自己的插件包
  • Ansys的电磁场分析和系统电路仿真软件Electronics 2024 R1版本在Windows系统的下载与安装配置
  • 离散数学---树
  • leetcode 所有可能的路径(图的遍历)
  • Ansible——unarchive模块
  • 异步复位和同步释放
  • myEclipse新手使用教程
  • 【SpringBoot】SpringBoot整合RabbitMQ消息中间件,实现延迟队列和死信队列
  • ssm物流管理系统-计算机毕业设计源码44323
  • 模式识别判断题
  • 2024教资认定报名流程,点赞收藏!
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • CAP 一致性协议及应用解析
  • CSS居中完全指南——构建CSS居中决策树
  • echarts花样作死的坑
  • EventListener原理
  • Fundebug计费标准解释:事件数是如何定义的?
  • java正则表式的使用
  • js
  • Odoo domain写法及运用
  • Python实现BT种子转化为磁力链接【实战】
  • React Native移动开发实战-3-实现页面间的数据传递
  • ucore操作系统实验笔记 - 重新理解中断
  • 多线程 start 和 run 方法到底有什么区别?
  • 分布式任务队列Celery
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 强力优化Rancher k8s中国区的使用体验
  • 深入浅出Node.js
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • 在electron中实现跨域请求,无需更改服务器端设置
  • 国内开源镜像站点
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • ​Java基础复习笔记 第16章:网络编程
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • #100天计划# 2013年9月29日
  • #include
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • (C语言)逆序输出字符串
  • (第三期)书生大模型实战营——InternVL(冷笑话大师)部署微调实践
  • (独孤九剑)--文件系统
  • (黑客游戏)HackTheGame1.21 过关攻略
  • (四)事件系统
  • (转)人的集合论——移山之道
  • .NET Core 版本不支持的问题
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008
  • .NET MVC第三章、三种传值方式
  • .NET 反射的使用
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • .Net7 环境安装配置
  • .NET框架类在ASP.NET中的使用(2) ——QA
  • .net实现客户区延伸至至非客户区