百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

Redis 中 AOF 持久化技术原理全解析,看完你就懂了!

mhr18 2025-05-14 15:00 4 浏览 0 评论

你在使用 Redis 的过程中,有没有担心过数据丢失的问题?尤其是在服务器突然宕机、意外断电等情况发生时,那些还没来得及持久化的数据,是不是让你夜不能寐?别担心,Redis 的 AOF 持久化技术就是来解决这些问题的!今天咱们就好好唠唠 Redis 中 AOF 持久化技术的原理,相信看完这篇文章,你能对它有一个全新的认识,以后用起来也能更加得心应手。

Redis 与 AOF:为什么它如此重要?

Redis 是一款高性能的键值对数据库,在互联网大厂的后端开发中被广泛使用。在实际应用场景里,数据的安全性和完整性至关重要。Redis 支持两种持久化方式,RDBAOF。RDB 是通过快照的方式在指定时间间隔对数据进行持久化,而 AOF 则是通过追加命令的方式来实现。相比之下,AOF 能够更好地保证数据的完整性,因为它可以记录每一条写命令,即使发生故障,也能通过回放这些命令来恢复数据。

AOF 持久化:具体是如何工作的?

Redis 的 AOF 持久化功能的实现主要分为三个步骤:命令追加文件写入文件同步

命令追加:当 AOF 功能开启后,Redis 服务器每执行完一个写命令,都会将这条写命令追加到服务器的aof_buf缓冲区的末尾 。

文件写入:接着,Redis 会根据配置选项来判断是否要将aof_buf中的内容写入到磁盘中的 AOF 文件。在redis.conf配置文件中的appendfsync配置项可填always、everysec和no三种参数:

    • always:每次执行写命令都将aof_buf中的数据写入并同步到 AOF 文件,这种方式最安全但效率最慢;
    • everysec:每隔一秒,将aof_buf中的数据写入并同步到 AOF 文件,效率较高且故障时最多丢 1 秒数据,是企业常用的配置;
    • no:表示将aof_buf中的数据写入到 AOF 文件,但不同步,由操作系统决定何时同步,不可控,使用较少。

文件同步:现代操作系统为提高写文件效率,用户调用write函数后,数据先存内存缓冲区,满了或到一定时间才写入磁盘,OS 提供fsync和fdatasync函数可强制将缓冲区数据立刻同步到磁盘,AOF 文件从命令被追加到真正写入磁盘经过了两道缓存。

AOF 重写:解决文件膨胀的利器

随着服务器运行,AOF 文件会不断增大,这不仅会占用大量磁盘空间,还会影响 Redis 服务器的性能以及数据还原时间。为解决此问题,Redis 提供了 AOF 重写机制。

Redis 创建新 AOF 文件覆盖原有文件来完成重写,重写过程不读取或修改老 AOF 文件,而是从数据库中读取现有数据写入新 AOF 文件,即遍历数据库所有键,用命令记录键值对,达到压缩文件目的。

而且 Redis 起子线程做 AOF 重写,不阻塞主线程。重写时新执行的命令不仅追加到 AOF 缓冲区,还追加到 AOF 重写缓冲区。子线程重写完成发信号给主线程,主线程将 AOF 重写缓冲区数据写入新 AOF 文件,然后给新文件改名替换老文件。

数据还原:重启后的关键操作

当 Redis 服务器重启时,就需要载入 AOF 文件进行数据还原。这时会创建一个不带网络连接的伪客户端,因为 Redis 命令只能在客户端上下文中执行,载入 AOF 文件时命令来自文件而非网络连接,所以用无网络连接的伪客户端执行 AOF 文件中的写命令。

接着从 AOF 文件中分析并读取出一条写命令,使用伪客户端执行该命令,一直重复直到 AOF 文件中的所有写命令都被处理完毕,从而还原服务器关闭之前的数据库状态。

混合持久化

此外,还有混合持久化模式,在混合模式下,RDB 文件和 AOF 文件合二为一,前面一部分是 RDB 格式,后面一部分是 AOF 格式。重启 Redis 实例时,先加载前面的 RDB 部分,再追加执行后面的 AOF 部分,既保证了空间利用率,又保证了命令保存的时效性和完整性。

总结

通过以上对 Redis 中 AOF 持久化技术原理的详细讲解,相信你已经对它有了深入的了解。从命令追加、文件写入和同步,到 AOF 重写、文件载入与数据还原,再到混合持久化模式,每一个环节都有着它独特的作用和意义。掌握了 AOF 持久化技术,你在使用 Redis 时就能更加从容,不用担心数据丢失的问题。

如果你在实际应用中还有其他关于 Redis 的问题,欢迎在评论区留言讨论。也别忘了点赞、分享这篇文章,让更多的后端开发小伙伴一起学习进步!

相关推荐

B站收藏视频失效?mybili 收藏夹备份神器完整部署指南

本内容来源于@什么值得买APP,观点仅代表作者本人|作者:羊刀仙很多B站用户都有过类似经历:自己精心收藏的视频突然“消失”,点开一看不是“已被删除”,就是“因UP主设置不可见”。而B站并不会主动通知...

中间件推荐初始化配置

Redis推荐初始化配置bind0.0.0.0protected-modeyesport6379tcp-backlog511timeout300tcp-keepalive300...

Redis中缓存穿透问题与解决方法

缓存穿透问题概述在Redis作为缓存使用时,缓存穿透是常见问题。正常查询流程是先从Redis缓存获取数据,若有则直接使用;若没有则去数据库查询,查到后存入缓存。但当请求的数据在缓存和数据库中都...

后端开发必看!Redis 哨兵机制如何保障系统高可用?

你是否曾在项目中遇到过Redis主服务器突然宕机,导致整个业务系统出现数据读取异常、响应延迟甚至服务中断的情况?面对这样的突发状况,作为互联网大厂的后端开发人员,如何快速恢复服务、保障系统的高可用...

Redis合集-大Key处理建议

以下是Redis大Key问题的全流程解决方案,涵盖检测、处理、优化及预防策略,结合代码示例和最佳实践:一、大Key的定义与风险1.大Key判定标准数据类型大Key阈值风险场景S...

深入解析跳跃表:Redis里的"老六"数据结构,专治各种不服

大家好,我是你们的码农段子手,今天要给大家讲一个Redis世界里最会"跳科目三"的数据结构——跳跃表(SkipList)。这货表面上是个青铜,实际上是个王者,连红黑树见了都要喊声大哥。...

Redis 中 AOF 持久化技术原理全解析,看完你就懂了!

你在使用Redis的过程中,有没有担心过数据丢失的问题?尤其是在服务器突然宕机、意外断电等情况发生时,那些还没来得及持久化的数据,是不是让你夜不能寐?别担心,Redis的AOF持久化技术就是...

Redis合集-必备的几款运维工具

Redis在应用Redis时,经常会面临的运维工作,包括Redis的运行状态监控,数据迁移,主从集群、切片集群的部署和运维。接下来,从这三个方面,介绍一些工具。先来学习下监控Redis实时...

别再纠结线程池大小 + 线程数量了,没有固定公式的!

我们在百度上能很轻易地搜索到以下线程池设置大小的理论:在一台服务器上我们按照以下设置CPU密集型的程序-核心数+1I/O密集型的程序-核心数*2你不会真的按照这个理论来设置线程池的...

网络编程—IO多路复用详解

假如你想了解IO多路复用,那本文或许可以帮助你本文的最大目的就是想要把select、epoll在执行过程中干了什么叙述出来,所以具体的代码不会涉及,毕竟不同语言的接口有所区别。基础知识IO多路复用涉及...

5分钟学会C/C++多线程编程进程和线程

前言对线程有基本的理解简单的C++面向过程编程能力创造单个简单的线程。创造单个带参数的线程。如何等待线程结束。创造多个线程,并使用互斥量来防止资源抢占。会使用之后,直接跳到“汇总”,复制模板来用就行...

尽情阅读,技术进阶,详解mmap的原理

1.一句话概括mmapmmap的作用,在应用这一层,是让你把文件的某一段,当作内存一样来访问。将文件映射到物理内存,将进程虚拟空间映射到那块内存。这样,进程不仅能像访问内存一样读写文件,多个进程...

C++11多线程知识点总结

一、多线程的基本概念1、进程与线程的区别和联系进程:进程是一个动态的过程,是一个活动的实体。简单来说,一个应用程序的运行就可以被看做是一个进程;线程:是运行中的实际的任务执行者。可以说,进程中包含了多...

微服务高可用的2个关键技巧,你一定用得上

概述上一篇文章讲了一个朋友公司使用SpringCloud架构遇到问题的一个真实案例,虽然不是什么大的技术问题,但如果对一些东西理解的不深刻,还真会犯一些错误。这篇文章我们来聊聊在微服务架构中,到底如...

Java线程间如何共享与传递数据

1、背景在日常SpringBoot应用或者Java应用开发中,使用多线程编程有很多好处,比如可以同时处理多个任务,提高程序的并发性;可以充分利用计算机的多核处理器,使得程序能够更好地利用计算机的资源,...

取消回复欢迎 发表评论: