Redis AOF持久化:用“记账”的方式守护数据安全

大家好!在上一篇文章中,我们深入剖析了RDB持久化,它就像给数据拍"快照",恢复速度快,但有个致命弱点:可能会丢失最后一次快照后的所有数据。

如果你的业务对数据完整性要求极高,比如金融交易或实时计数,这种"分钟级"的数据丢失是无法接受的。这时,我们就需要请出Redis的另一种持久化方案------AOF。它不拍快照,而是像一个忠实的会计,把每一笔"交易"都记录下来。

今天,我们就来聊聊AOF是如何通过"记账"的方式,实现秒级甚至零数据丢失的。


什么是AOF?

AOF的全称是Append Only File ,即"追加文件"。它的核心思想非常简单:记录Redis服务器接收到的所有写操作命令

与RDB生成一个二进制快照不同,AOF文件是一个纯文本的"命令日志"。例如,当你执行SET num 123命令时,AOF文件会记录下类似*3\r\n$3\r\nset\r\n$3\r\nnum\r\n$3\r\n123\r\n这样的内容。

当Redis重启时,它会重新读取并执行AOF文件中的所有写命令,就像重播一遍历史操作,从而将数据恢复到故障前的状态。


如何开启AOF?

AOF默认是关闭的。要开启它,只需修改redis.conf配置文件:

  1. 找到appendonly配置项,将其设置为yes
  2. 你可以通过appendfilename配置项来指定AOF文件的名称,默认是appendonly.aof

重启Redis后,AOF就会开始工作,默默记录下你的每一次写操作。


核心配置:刷盘策略的权衡

AOF记录了命令,但这些命令何时真正写入磁盘呢?这直接关系到数据的安全性和性能。Redis提供了三种刷盘策略,通过appendfsync配置项来设置:

always:同步刷盘(最安全,最慢)

  • 机制:每次写命令执行后,都立即同步写入磁盘。
  • 优点:可靠性最高,几乎不会丢失数据。
  • 缺点:每次写入都涉及磁盘I/O,性能开销最大,会严重影响Redis的吞吐量。

everysec:每秒刷盘(默认,推荐)

  • 机制:写命令会先放入内存缓冲区,然后由一个后台线程每秒将缓冲区的内容统一写入磁盘。
  • 优点:在性能和安全性之间取得了很好的平衡。
  • 缺点:理论上最多可能丢失1秒的数据(比如在两次刷盘之间宕机)。

no:由操作系统控制(最快,最不安全)

  • 机制:Redis不主动刷盘,完全交给操作系统的调度。
  • 优点:性能最好。
  • 缺点:可靠性最差,可能丢失大量数据,取决于操作系统何时将缓冲区数据写入磁盘。

在生产环境中,everysec是绝大多数场景下的最佳选择


AOF重写:给"账本"瘦身

随着时间推移,AOF文件会变得越来越大。比如,你可能对一个键执行了上万次INCR操作,但最终只有最后一次的值是有意义的。记录所有这些冗余命令会浪费大量磁盘空间,并拖慢恢复速度。

为了解决这个问题,Redis引入了AOF重写机制。

手动触发

你可以执行BGREWRITEAOF命令来手动触发重写。

自动触发

Redis也支持自动重写,通过以下两个配置项控制:

  • auto-aof-rewrite-percentage 100:当AOF文件体积比上一次重写后增长了100%时触发。
  • auto-aof-rewrite-min-size 64mb:AOF文件体积至少要达到64MB才会触发重写。

重写原理

重写过程同样是在后台异步完成的。Redis会创建一个子进程,它会读取当前内存中的数据,然后生成一组能恢复这些数据的最小命令集 ,写入一个新的AOF文件。例如,将多次SET同一个键的操作合并为一次SET。最后,用新文件替换旧文件,从而实现"瘦身"。


AOF与RDB:如何选择?

了解了AOF,我们再把它和RDB做个对比:

特性 RDB AOF
数据安全性 较低,可能丢失分钟级数据 ,最多丢失1秒数据
恢复速度 ,直接加载二进制快照 慢,需要重放所有命令
文件体积 ,经过压缩 大,记录的是文本命令
适用场景 冷备、灾难恢复 对数据完整性要求高的业务

最佳实践

其实,你不必二选一。Redis支持同时开启RDB和AOF。在这种情况下,Redis重启时会优先使用AOF来恢复数据,因为它更完整。这样既能享受AOF的数据安全性,又能利用RDB的快速恢复能力(AOF重写时会利用RDB格式来加速)。


知识小结

为了方便大家复习,我整理了本节的重点速查表:

知识点 核心内容 避坑/考点
工作原理 记录所有写操作命令,重启时重放 文件是纯文本格式,可读性强
刷盘策略 always / everysec / no 生产环境推荐使用everysec
AOF重写 压缩冗余命令,减小文件体积 通过BGREWRITEAOF手动触发
与RDB对比 数据更安全,但文件更大、恢复更慢 推荐同时开启,AOF优先恢复
相关推荐
Fᴏʀ ʏ꯭ᴏ꯭ᴜ꯭.12 小时前
《redis-cluster 集群部署完全手册(含扩容+缩容)》
数据库·redis·缓存
0xDevNull12 小时前
Java项目中Redis热点Key自动检测方案详细教程
java·spring boot·redis
spencer_tseng14 小时前
redis.windows.conf 2026.04.27
windows·redis
大G的笔记本16 小时前
分布式事务
分布式
weixin_4196583116 小时前
RabbitMQ 的高级特性
java·分布式·rabbitmq
八秒记忆的老男孩17 小时前
Sentinel5P的L1B级数据预处理(BD7和BD8)【20260427】
数据库·redis·缓存
_F_y17 小时前
仿RabbitMQ实现消息队列-服务端核心模块实现(1)
分布式·rabbitmq
OYangxf17 小时前
基于epoll的单线程Reactor:Tinyredis的网络层实现
c++·redis
.柒宇.19 小时前
RabbitMQ入门教程
分布式·rabbitmq
snow@li19 小时前
数据库-Oracle:常用语法 / Oracle 核心知识技能梳理
数据库·redis·缓存