Redis 持久化 RDB 和 AOF 怎么选
Redis 数据在内存里,一断电就全没了,所以要持久化。它给了两条路:RDB 拍快照、AOF 记操作日志。这篇讲清 RDB 和 AOF 各自怎么干活、差在哪、丢数据的风险有多大,再说说实际里到底怎么搭配着选。
Redis 快,是因为数据都放在内存里。但内存有个天生的软肋:一断电、一重启,数据就全没了。
所以 Redis 得想办法把内存里的数据,时不时落到磁盘上存一份,这就是持久化。
Redis 给了两条路:RDB 和 AOF。名字唬人,其实思路特别好懂。这篇我们把它俩讲清楚,再说说到底怎么选。
为什么需要持久化
先想通这个必要性。
很多人觉得 Redis 就是个缓存,丢了就丢了,从数据库重新捞一遍呗,要啥持久化。
这话对一半。纯当缓存确实可以不在乎。但现在 Redis 早不只是缓存了——有人拿它存会话、存分布式锁、存计数器、甚至当轻量数据库用。这些数据一丢,可能就是真出事。
再说就算当缓存,如果一重启缓存全空,海量请求瞬间全砸到后面的数据库上(这叫缓存雪崩),数据库可能直接被压垮。
所以持久化的意义是:重启之后,能把数据尽量恢复回来,不至于从零开始。
怎么恢复?就靠 RDB 和 AOF 这两种落盘方式。它俩的思路完全不同,我们分开看。
RDB 给内存拍快照
RDB 的思路,是给某一时刻的内存数据拍一张照片,整个存成一个文件。
就像你给房间拍了张照,把此刻屋里所有东西的摆放原样定格下来。
这张“照片”是个压缩过的二进制文件(默认叫 dump.rdb)。等 Redis 重启时,把这张照片一读,内存瞬间就恢复到拍照那一刻的样子。
它有两个很突出的优点:
- 文件小、恢复快:是压缩过的二进制,同样的数据比 AOF 那种日志小得多,重启加载也快
- 对性能影响小:拍快照这活儿是另开一个子进程去干的,主进程该干嘛干嘛,基本不耽误对外服务
但它有个致命短板:会丢数据。
因为它是隔一段时间才拍一次(比如每 5 分钟一次)。假设它 3 点整拍了一张,结果 3 点 04 分服务器崩了——那这 4 分钟里新写进去的数据,因为还没来得及拍进下一张照片,就彻底没了。
拍照的间隔越长,能丢的就越多。这是 RDB 绕不开的取舍。
AOF 记操作流水账
AOF 换了个完全不同的思路:不拍照了,改成记账。
它把每一条写命令(set、del 这些)都追加记到一个日志文件里,像流水账一样。
重启的时候,Redis 不是读照片,而是把这个账本从头到尾重新执行一遍——你之前写过的每条命令再跑一次,数据自然就回来了。
它的最大优点是:丢的数据少,安全。
因为它是每来一条写命令就记,不像 RDB 那样攒着。配置得当的话,最多丢一秒的数据,甚至能做到几乎不丢。
那 AOF 是不是就完美了?也不是,它的代价是:
- 文件大:一条条命令记下来,日志比 RDB 的快照大不少
- 恢复慢:重启要把所有命令重放一遍,数据量大时比读 RDB 快照慢
- 持续写盘有开销:一直在往磁盘追加,对性能多少有点影响
还有个细节:账本记久了会越来越臃肿,里面有很多冗余(比如同一个 key 被改了 100 次,其实只有最后一次有用)。所以 AOF 有个重写机制,会定期把账本压缩成一个等效的、更精简的版本,把那些没用的中间步骤删掉。
拉个表把差异对齐
零散讲完,摆张表对照着看更清楚:
对比项 RDB(快照) AOF(日志)
-------- ---------------- ----------------
方式 定时拍全量快照 实时记每条写命令
文件 小(压缩二进制) 大(命令流水)
恢复速度 快 慢(要重放命令)
丢数据 可能丢较多(看间隔) 丢得少(最多丢1秒)
性能影响 小(子进程干) 略大(持续写盘)
适合 能容忍丢一点、要快恢复 对数据安全要求高
一句话概括这俩的性格:
- RDB 图快、图省心,但可能丢一段
- AOF 图稳、图安全,但费空间费时间
那到底怎么选
绕回最开始的问题。我的建议分几种情况说。
纯缓存、丢了无所谓、追求极致性能 → 用 RDB 就够,甚至可以两个都关(反正数据库里有源数据)。
在意数据、不能丢太多 → 用 AOF,把丢失窗口压到最小。
大多数正经业务 → 两个一起开。
这是官方也推荐的搭配,取两者之长:
- 平时靠 AOF 保证数据尽量不丢(安全兜底)
- 重启恢复时,Redis 会优先用 AOF 来恢复(因为它的数据更全更新)
- RDB 那份快照则可以留作冷备份,需要快速搞一份数据副本、或者做灾备迁移时特别方便
所以现实里很少非此即彼地二选一,更多是 AOF 保安全,RDB 做备份,两个各司其职。
补一句我自己的体会:别一上来就纠结配置怎么调最优。先想清楚你这份数据丢了要不要紧——要紧就开 AOF,不要紧 RDB 甚至不开都行。想明白这个前提,配置自然就定了。
小结
Redis 持久化,核心就是拿两种思路对抗“断电数据丢”。
- RDB 拍快照:定时存全量,文件小、恢复快、性能好,但可能丢一段数据
- AOF 记流水账:实时记写命令,丢得少、更安全,但文件大、恢复慢
- 怎么选:纯缓存用 RDB,在意数据用 AOF,正经业务两个一起开——AOF 保安全,RDB 做备份
说到底就一句判断:这份数据丢了疼不疼。 疼就往 AOF 靠,不疼就让 RDB 顶着。想清楚这个,选起来一点都不难。那就照着你的数据重要程度去配吧。
