大家好!在上一篇文章中,我们深入剖析了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配置文件:
- 找到
appendonly配置项,将其设置为yes。 - 你可以通过
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优先恢复 |