在上一章我们深入学习了 Redis 中重要的数据持久化机制 ——RDB(Redis Database),了解了其通过周期性快照将数据以二进制文件形式保存到磁盘的原理,包括触发条件、文件结构以及优缺点等核心内容。

Redis 持久化机制详解:RDB、AOF 原理与面试最佳实践(RDB篇)

目录

🎯什么是 AOF 持久化?

🎯AOF 的基本工作原理

🚀命令追加(Append)

🚀文件写入(Write)

🚀文件同步(Fsync)

🚀文件重写(Rewrite)

🚀重启加载(Load)

🎯AOF 持久化方式详解 

🚀三种 AOF 持久化方式对比

🚀三种方式的工作原理解析

always 方式:实时同步

everysec 方式:每秒同步(默认)

no 方式:系统控制同步

🚀AOF 持久化配置与最佳实践

📊配置方式

📊最佳实践

🎯总结


而在本章,我们将延续对 Redis 持久化机制的探索,聚焦于另一种关键方案 ——AOF(Append Only File)

🎯什么是 AOF 持久化?

AOF(Append-Only File)持久化 是 Redis 提供的另一种持久化机制,其核心思想是:将 Redis 的所有写操作命令(如 SETHSETDEL 等)以协议格式(RESP)追加写入到一个日志文件中。 与 RDB 的“快照”方式不同,AOF 更像一个 操作日志,记录了数据从创建到修改的完整过程。 默认情况下,AOF 的文件名是 appendonly.aof,可以通过 redis.conf 配置文件自定义。

🎯AOF 的基本工作原理

AOF(Append Only File)是 Redis 实现数据持久化的核心机制之一,通过记录写命令日志实现数据恢复。其工作流程可拆解为以下 5 个关键阶段:

🚀命令追加(Append)

  • Redis 执行写命令(如 SETHSETLPUSH)后,将命令转换为 Redis 协议格式(如 *3\r\n$3\r\nSET\r\n$3\r\nkey\r\n$5\r\nvalue\r\n)。

  • 命令会立即追加到 AOF 缓冲区(内存区域),而非直接写入磁盘,避免每次写操作都触发磁盘 I/O。

🚀文件写入(Write)

  • Redis 定期(由系统调度)将 AOF 缓冲区数据写入 AOF 文件(位于磁盘)。

  • 此步骤调用 Linux 系统函数 write(),将数据写入内核缓冲区(Kernel Buffer)后立即返回,数据尚未真正落盘(延迟写)。

  • 数据丢失风险:若系统崩溃,内核缓冲区的数据可能丢失(默认由操作系统每 30 秒同步一次,或根据缓冲区状态决定)。

🚀文件同步(Fsync)

  • 通过 appendfsync 配置控制同步策略,决定何时将内核缓冲区数据强制刷盘:

    • always:每条命令写入后立即调用 fsync(),数据安全性最高(最多丢失当前命令),但性能开销大。

    • everysec(默认):每秒调用一次 fsync(),最多丢失 1 秒数据,兼顾性能与安全。

    • no:由操作系统控制同步时机,性能最优但风险最大(可能丢失大量数据)。

  • fsync() 是关键系统调用,会阻塞直到数据真正写入磁盘后返回。

🚀文件重写(Rewrite)

  • 触发条件:AOF 文件体积过大时(如超过上次重写后大小的 100% 且文件超过 64MB),自动触发重写。

  • 核心逻辑

    • 从当前内存数据生成最小命令集(如合并多次 INCR 为单次 SET),无需读取旧 AOF 文件。

    • 主进程 fork 子进程执行重写,期间新命令继续写入旧 AOF 文件并缓存到 重写缓冲区

    • 子进程完成后,主进程将重写缓冲区的增量命令追加到新文件,替换旧文件。

🚀重启加载(Load)

  • Redis 启动时,优先加载 AOF 文件(若存在)。

  • 按顺序执行 AOF 文件中的所有命令,重建内存数据状态。

Linux 系统直接提供了一些函数用于对文件和设备进行访问和控制,这些函数被称为 系统调用(syscall)。下图为关键系统调用对比

系统调用功能描述数据落盘时机性能影响数据安全风险
write()将数据写入内核缓冲区由操作系统调度(默认约 30 秒)低(非阻塞)高(可能丢失缓冲区数据)
fsync()强制内核缓冲区数据同步到磁盘调用完成后高(阻塞直到完成)低(数据已落盘)

🎯AOF 持久化方式详解 

AOF(Append Only File)持久化通过记录 Redis 写命令来实现数据持久化,其核心是控制命令同步到磁盘的策略。根据不同的同步时机,AOF 支持以下三种持久化方式:

🚀三种 AOF 持久化方式对比
持久化方式同步策略数据安全性性能影响适用场景
always每条写命令执行后立即调用 fsync() 强制同步到磁盘。最高(几乎不丢数据)性能最低金融交易、订单系统等强一致性场景
everysec每秒调用一次 fsync() 同步磁盘(默认策略)。较高(最多丢 1 秒数据)性能适中大多数业务场景(兼顾安全与性能)
no不主动调用 fsync(),由操作系统决定同步时机(通常内核缓冲区满或超时)。最低(可能丢大量数据)性能最高对数据安全性要求极低的场景
🚀三种方式的工作原理解析
  1. always 方式:实时同步
    • 流程:写命令 → 追加到 AOF 缓冲区 → 立即调用 fsync() 落盘 → 返回客户端。

    • 特点

      • 每次写操作都阻塞等待磁盘写入完成,确保数据不丢失。

      • 磁盘 I/O 频繁,Redis 吞吐量可能下降(尤其写入密集场景)。

  2. everysec 方式:每秒同步(默认)
    • 流程:写命令 → 追加到 AOF 缓冲区 → 写入系统内核缓冲区(未落盘)→ 每秒触发一次 fsync() 落盘。

    • 特点

      • 利用操作系统缓冲机制,减少磁盘 I/O 次数,性能较好。

      • 若 Redis 宕机或系统崩溃,最多丢失 1 秒内的命令(因为最后一秒的命令可能在缓冲区未落盘)。

  3. no 方式:系统控制同步
    • 流程:写命令 → 追加到 AOF 缓冲区 → 写入系统内核缓冲区 → 由 Linux 内核决定何时同步(如缓冲区满或 30 秒超时)。

    • 特点

      • Redis 完全不控制磁盘同步,性能最优(无 fsync() 阻塞)。

      • 数据安全性最差,若系统崩溃,可能丢失大量未同步的命令。

🚀AOF 持久化配置与最佳实践
📊配置方式

在 Redis 配置文件(redis.conf)中通过 appendfsync 参数设置:

# 示例配置
appendfsync always       # 实时同步(强安全,低性能)
# appendfsync everysec   # 每秒同步(默认,平衡方案)
# appendfsync no         # 系统控制(高性能,低安全)
📊最佳实践
  • 优先选择 everysec:兼顾数据安全性和性能,是 Redis 官方推荐的默认策略。

  • always 谨慎使用:仅在对数据一致性要求极高(如金融交易)且硬件磁盘性能极佳时使用。

  • no 极少使用:除非业务允许丢失大量数据(如临时缓存),否则不建议配置。

🎯总结

AOF持久化作为Redis数据安全的重要保障,通过记录写命令的方式提供了高可靠性的持久化方案。合理配置同步策略和重写机制,结合混合持久化等新特性,可以在保证数据安全的同时兼顾系统性能。生产环境中应根据业务特点和数据重要性选择合适的持久化策略,并建立完善的监控和备份机制。 

您的支持是我持续创作的动力:🎯📊🚀 

❤️ 点赞:如果这个项目对您有所启发,请多多点点赞支持一下
📌 收藏:完整项目源码已开源,有需要收藏自取
👀 关注:订阅我的专栏,不错过后续更多优质内容

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

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

相关文章

【GateWay】和权限验证

【GateWay】网关详解和权限验证 一、Gateway 核心概念与架构二、路由断言(Route Predicates)详解三、过滤器(Filters)机制四、权限认证的核心理论模型五、Spring Cloud Gateway Security OAuth2 集成方案六、OAuth2.0 集成 一、…

QSqlDatabase: QSQLITE driver not loaded

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言可能的原因解决办法1. 确认 SQLite 驱动插件文件2. 拷贝插件文件到应用程序目录3. 设置插件搜索路径4. 安装 SQLite 依赖库5. 解决 QCoreApplication 实例问题 …

20250619在荣品的PRO-RK3566开发板的Android13下解决海罗光电有限公司HL070T58C-05屏在启动的时候出现白色条纹的问题【时序】

20250619在荣品的PRO-RK3566开发板的Android13下解决海罗光电有限公司HL070T58C-05屏在启动的时候出现白色条纹的问题 2025/6/19 20:39 缘起:荣品的PRO-RK3566开发板的Android13下,点亮海罗光电有限公司HL070T58C-05屏。 在启动的时候会出现花屏/白色条纹…

docker使用Volume对Nginx进行挂载

需求: 需要将Nginx的欢迎页面也就是index.html文件进行修改。 原始方法:由于docker会为每一个容器创建其对应的文件信息,但是创建的信息内容只有其最基础的运行信息,所以想要直接去访问其index.html就无法做到。 使用volume&am…

基于springboot的宠物服务预约系统

博主介绍:java高级开发,从事互联网行业六年,熟悉各种主流语言,精通java、python、php、爬虫、web开发,已经做了六年的毕业设计程序开发,开发过上千套毕业设计程序,没有什么华丽的语言&#xff0…

idea 2025会在用户目录创建IdeaSnapshots文件夹

推荐一个api管理测试工具 一个简单的API测试和编写文档的工具 idea 2025会在用户目录创建IdeaSnapshots文件夹 解决方案 打开 Profiler 点击 setting 参考 https://youtrack.jetbrains.com/articles/SUPPORT-A-1086/How-to-change-or-turn-off-the-IdeaSnapshots-folder-…

【Mini-F5265-OB开发板试用测评】2、PWM驱动遥控车RX2接收解码带马达驱动控制IC

手头有带转向电机和动力电机小车底盘,买了很久一直在吃灰。 最近查了一下小车的驱动IC是富满微的8D420L,是一款传统的RX2接收解码芯片,带马达驱动。 手头没有TX2发送芯片,所以考虑用MCU直接发送PWM直接接入RX2,可能可以驱动。 一…

Tcpdump网络抓包工具详解!

一、简介 tcpdump就是:dump the traffic on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具。 tcpdump是一个用于截取网络分组,并输出分组内容的工具。凭借强大的功能和灵活的截取策略,使其成为类UNIX系统下用…

Spring Boot的Security安全控制——应用SpringSecurity!

应用Spring Security 前面介绍了在项目开发时为什么选择Spring Security,还介绍了它的原理。本节开始动手实践Spring Security的相关技术。 实战:Spring Security入门 现在开始搭建一个新项目,实践一个Spring Security的入门程序。 &…

FPGA基础 -- Verilog行为级建模之alawys语句

Verilog 中的 always 语句块,这是行为级建模的核心结构之一,在 RTL 级设计中广泛用于时序逻辑和组合逻辑的建模。 一、什么是 always 语句? ✅ 定义: always 语句用于描述可综合的硬件行为逻辑,表示一个**“事件驱动…

【力扣 简单 C】704. 二分查找

目录 题目 解法一&#xff1a;二分查找 题目 解法一&#xff1a;二分查找 int find(const int* nums, int size, int target) {int left 0, right size - 1;while (left < right){int mid (left right) / 2;if (nums[mid] < target)left left 1;else if (nums[m…

Java并发编程实战 Day 30:并发编程未来展望与最佳实践总结

【Java并发编程实战 Day 30】并发编程未来展望与最佳实践总结 文章简述 经过30天的系统学习&#xff0c;我们从Java并发编程的基础知识逐步深入到高并发系统的架构设计与性能优化。本文作为“Java并发编程实战”系列的收官之作&#xff0c;将全面回顾整个系列的核心内容&#…

量化面试绿皮书:23. 醉酒乘客

文中内容仅限技术学习与代码实践参考&#xff0c;市场存在不确定性&#xff0c;技术分析需谨慎验证&#xff0c;不构成任何投资建议。 23. 醉酒乘客 100名乘客排队登机&#xff0c;每人持有一张对应座位的机票&#xff08;第n位乘客的座位号为n&#xff09;。 第一位乘客喝醉后…

AntV G6入门教程

以下教程聚焦于 AntV G6 的 数据操作 API,详细介绍各个方法的用途、参数以及完整的使用示例,帮助你在图实例上精细地读取、修改和管理节点/边/组合等数据。文中示例代码均基于 G6 v5.0.47 官方文档 ([g6.antv.antgroup.com][1])。 一、获取完整图数据 1.1 graph.getData() …

67、数据访问-crud实验-分页数据展示

67、数据访问-crud实验-分页数据展示 分页数据展示是数据访问中常见的功能&#xff0c;用于将大量数据分割成多个页面显示&#xff0c;提升用户体验和系统性能。以下是分页数据展示的相关介绍&#xff1a; #### 基本原理 1. **确定每页显示数量**&#xff1a;设定每页显示的数…

常见 Web 服务器

Web 服务器有很多种&#xff0c;功能和用途略有不同&#xff0c;下面我会分类介绍主流的 Web 服务器&#xff08;包含静态/动态/反向代理支持&#xff09;并重点说明类似 Tomcat 的 Java 支持型。 常见 Web 服务器分类 类型名称描述与特点&#x1f310; 静态资源服务器Nginx高…

【MacOS】M3 Pro芯片MacBook极速搭建Kubernetes

M3 Pro 芯片 MacBook 2023上使用 Colima 安装 Kubernetes。 Colima 轻量、高效&#xff0c;并且在 Apple Silicon 架构上表现出色。 下面是详细的、一步一步的安装和配置指南。 核心思路 我们将通过以下步骤完成整个过程&#xff1a; 准备工作: 安装必要的工具&#xff0c;…

import { Add, Dongdong, UserAdd } from ‘@nutui/icons-react‘ 使用图标导入库报错

import { Add } from "nutui/icons-react-taro"; 官网的导入的库名字不全&#xff0c;后面要加-taro&#xff0c;就行了

猿人学js逆向比赛第一届第七题

分析响应 看到响应体里面的data是个字体加密&#xff0c;于是这里可以看到woff文件也给返回了&#xff0c;这里现分析这个文件。 打开可以看到这里a351对应的是3和页面中的3是对应的&#xff0c;于是用ddddocr动态识别字体文件中的字体&#xff0c;然后对应对应的字体替换是不…

股票心理学习篇:交易的人性弱点 - 频繁交易

以下内容为学习时的笔记整理&#xff0c;视频作者来自B站&#xff1a;老猫与指标 视频链接&#xff1a;频繁交易必死&#xff1f;底层逻辑深度剖析&#xff0c;老猫的的破局心法与实战策略分享 交易的人性弱点 - 频繁交易 主讲人&#xff1a; 老猫 1. 引言&#xff1a;问题的…