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优先恢复
相关推荐
RATi GORI3 小时前
springBoot连接远程Redis连接失败(已解决)
spring boot·redis·后端
Zzxy4 小时前
Spring Boot 集成 Redisson 实现分布式锁
spring boot·redis
2402_881319307 小时前
引入 Redis 分布式锁解决并发脏写 (Dirty Write)-AI模拟面试的构建rag部分
redis·分布式·面试
刘~浪地球8 小时前
Redis 从入门到精通(九):事务详解
数据库·redis·缓存
__土块__8 小时前
一次电商秒杀系统架构评审:从本地锁到分布式锁的演进与取舍
java·redis·高并发·分布式锁·redisson·架构设计·秒杀系统
蒸蒸yyyyzwd9 小时前
检索系统学习笔记
分布式·学习
小旭95279 小时前
Spring Data Redis 从入门到实战:简化 Redis 操作全解析
java·开发语言·spring boot·redis·spring
无责任此方_修行中10 小时前
Redis 的"三面"人生:开源世界的权力转移
redis·后端·程序员
ningmengjing_10 小时前
从零推导出 Redis
数据库·redis