Redis 中 AOF 持久化技术原理全解析,看完你就懂了!
mhr18 2025-05-14 15:00 21 浏览 0 评论
你在使用 Redis 的过程中,有没有担心过数据丢失的问题?尤其是在服务器突然宕机、意外断电等情况发生时,那些还没来得及持久化的数据,是不是让你夜不能寐?别担心,Redis 的 AOF 持久化技术就是来解决这些问题的!今天咱们就好好唠唠 Redis 中 AOF 持久化技术的原理,相信看完这篇文章,你能对它有一个全新的认识,以后用起来也能更加得心应手。
Redis 与 AOF:为什么它如此重要?
Redis 是一款高性能的键值对数据库,在互联网大厂的后端开发中被广泛使用。在实际应用场景里,数据的安全性和完整性至关重要。Redis 支持两种持久化方式,RDB和AOF。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 的问题,欢迎在评论区留言讨论。也别忘了点赞、分享这篇文章,让更多的后端开发小伙伴一起学习进步!
相关推荐
- 一文带您了解数据库的行列之争:行式与列式存储的异同
-
数据库存储格式是数据库管理系统中一个至关重要的方面,它直接影响到数据的组织和检索效率。在数据库中,有两种主要的存储格式,即行式存储和列式存储。这两者采用截然不同的方法来组织和存储数据,各自具有一系列优...
- NL2SQL(三)开源项目怎么选:talk is cheap, show me the code!
-
老规矩,先看效果下面的demo来自试用的SuperSonic,将会在下面详细介绍:大模型时代Text-to-SQL特点随着基于LLM技术的发展,RAG/AIAgent/Fine...
- JDK25长期支持版九月降临:18项王炸功能全解析
-
Java要放大招啦!9月份推出的JDK25长期支持版已经锁定18个超能力,从稳定值到结构化并发,还有Linux系统下的"预知未来"性能分析!下面我用打游戏的术语给你们掰扯明白:1、飞...
- OceanBase 推出单机版 高度兼容MySQL和Oracle
-
【环球网科技综合报道】3月27日,独立数据库厂商OceanBase正式发布单机版产品。据悉,这一产品基于自主研发的单机分布式一体化架构设计,具备极简数据库架构和高度兼容性,为中小规模业务提供兼具性能与...
- 黄远邦:应对7月1日闰秒对Oracle数据库影响
-
由于今年7月1日全世界会多出一秒,这可能对时间敏感的IT系统造成较大影响。中亦科技数据库团队对此问题做了深入的研究,并对用户系统提出了相应的解决方法及建议。中亦科技数据库产品总监黄远邦认为,闰秒调整会...
- MySQL数据库密码忘记了,怎么办?(mysql 数据库密码)
-
#头条创作挑战赛#MySQL数据库密码忘记了且没有其他可以修改账号密码的账户时怎么办呢?登录MySQL,密码输入错误/*密码错误,报如下错误*/[root@TESTDB~]#mysql-u...
- Chinese AI Talent in Spotlight as Nvidia and Meta Escalate Talent War
-
OntherightisBanghuaZhu,ChiefResearchScientistatNVIDIATMTPOST--SiliconValley’stoptech...
- 用Cursor开启JAVA+AI生涯(javascirpt怎么开启)
-
Cursor是基于VSCode开发的一款编辑器,支持多种语言的开发编辑。与传统的开发工具相比,它有多种优势:与AI无缝集成,响应速度快,占用内存小。但很多同学在"起步"过程中遇到了...
- 毕业十年了,自从做了开发用了很多软件,但距离写开发工具还很远
-
办公系统类:办公软件Word、Excel、PowerPoint三大必备技能+腾讯/金山在线文档解压缩操作:7-zip/winrar文件文本处理:Notepad++(文本编辑器正则表达式超级好...
- 盘点Java中最没用的知识⑤:这3个老古董你还在代码里“考古”?
-
一、Stack类:“继承Vector”的历史bug,为何成了性能拖油瓶?你是不是在学Java集合时,老师说过“栈结构用Stack类”?是不是在老代码里见过"newStack<>(...
- Gemini 2.5 Pro 0506发布,编程最强大模型, 碾压 Claude3.7 sonnent
-
一、Gemini2.5Pro(I/Oedition)发布1、为何叫I/Oedition?谷歌史上最强编程模型Gemini2.5Pro(I/Oedition)发布,具体型号是Gemin...
- 如何让无聊变得有趣(附本人大量美图)
-
文/图:金冬成在这条长300公里的公路上,我已经来回往返了无数次。3小时车程,一个人,想想都是多么无聊的一件事。其实,人生道路上,类似这种无聊的事情有很多很多。无聊的事情、枯燥的工作,往往让我们容易失...
- Oracle 推出 Java 24,增强 AI 支持和后量子加密
-
导读:Oracle宣布正式发布Java24,该语言增加了几个新功能,例如StreamGatherersAPI和Class-FileAPI的可用性,以及专门为AI推理和量子安全设计...
- 公司ERP突然变慢?“索引重建”这颗“药”可不能随便吃!
-
各位老板、IT小哥、财务小姐姐,有没有遇到过公司ERP系统突然卡顿得像“老爷车”,点个按钮半天没反应,急得直跺脚?这时候,可能有人会跳出来说:“我知道,重建一下数据库索引就好了!”听起来像个“神操作”...
- 基于Java实现,支持在线发布API接口读取数据库,有哪些工具?
-
基于java实现,不需要编辑就能发布api接口的,有哪些工具、平台?还能一键发布、快速授权和开放提供给第三方请求调用接口的解决方案。架构方案设计:以下是一些基于Java实现的无需编辑或只需少量编辑...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- 一文带您了解数据库的行列之争:行式与列式存储的异同
- NL2SQL(三)开源项目怎么选:talk is cheap, show me the code!
- JDK25长期支持版九月降临:18项王炸功能全解析
- OceanBase 推出单机版 高度兼容MySQL和Oracle
- 黄远邦:应对7月1日闰秒对Oracle数据库影响
- MySQL数据库密码忘记了,怎么办?(mysql 数据库密码)
- Chinese AI Talent in Spotlight as Nvidia and Meta Escalate Talent War
- 用Cursor开启JAVA+AI生涯(javascirpt怎么开启)
- 毕业十年了,自从做了开发用了很多软件,但距离写开发工具还很远
- 盘点Java中最没用的知识⑤:这3个老古董你还在代码里“考古”?
- 标签列表
-
- oracle位图索引 (74)
- oracle批量插入数据 (65)
- oracle事务隔离级别 (59)
- oracle 空为0 (51)
- oracle主从同步 (55)
- oracle 乐观锁 (51)
- redis 命令 (78)
- php redis (88)
- redis 存储 (66)
- redis 锁 (69)
- 启动 redis (66)
- redis 时间 (56)
- redis 删除 (67)
- redis内存 (57)
- redis并发 (52)
- redis 主从 (69)
- redis 订阅 (51)
- redis 登录 (54)
- redis 面试 (58)
- 阿里 redis (59)
- redis 搭建 (53)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)
- redis 限流 (51)