Redis 持久化——RDB 快照 vs AOF 日志

重启就丢数据?那 Redis 和内存有啥区别。持久化就是给 Redis 上个"保险"。

本次导航

  • RDB:内存快照,定期备份,适合灾难恢复
  • AOF:操作日志,每次写入都记下来,更可靠
  • 混合持久化:RDB + AOF 的合体(Redis 4.0+)
  • 怎么选:数据安全 vs 性能,你站哪边?
  • 图解:RDB 和 AOF 的工作流程对比

发车前提醒:学完前面几种数据结构,该考虑"怎么把数据留住"了。持久化就是干这个的。

一、为啥需要持久化?

Redis 的数据默认存在内存里。一断电、一重启,啥都没了。

持久化就是把内存里的数据保存到硬盘上,下次启动时再读回来。

Redis 提供了两种持久化方案:

  • RDB(Redis Database) :在某个时间点把整个内存数据拍一张"快照",存成 .rdb 文件。
  • AOF(Append Only File) :把每一条写命令都追加到 .aof 文件里(类似 MySQL 的 binlog)。

它们可以单独用,也可以一起用。下面一个个说。

二、RDB:定时拍照,恢复快

2.1 工作原理

RDB 会在你指定的时间间隔内,把内存里的所有数据fork 一个子进程,由子进程写入磁盘。主进程继续处理请求,不阻塞。

2.2 怎么配置

在 redis.conf 里:

conf 复制代码
save 900 1     # 900 秒内至少有 1 个 key 变化,就触发 bgsave
save 300 10    # 300 秒内至少有 10 个 key 变化
save 60 10000  # 60 秒内至少有 10000 个 key 变化

也可以手动触发:SAVE(阻塞主进程,不建议)或 BGSAVE(后台 fork 子进程,推荐)。

2.3 优点 vs 缺点

优点 缺点
文件紧凑,恢复速度快(直接加载) 可能丢数据:最后一次快照之后的写操作全没
适合备份、灾备(可以拷贝到其他地方) 数据集大时 fork 子进程会短暂卡顿
恢复比 AOF 快很多 不能实时持久化

三、AOF:记操作日志,更可靠

3.1 工作原理

每一条写命令 (SET、HSET、LPUSH 等),Redis 都会追加到 appendonly.aof 文件末尾。重启时,Redis 会逐条执行 AOF 里的命令来恢复数据。

3.2 同步策略(关键!)

appendfsync 配置决定什么时候把缓冲区刷到磁盘:

策略 说明 数据安全性 性能
always 每次写命令都立即 fsync 最安全,最多丢一条命令 最慢
everysec 每秒 fsync 一次 最多丢 1 秒内的数据 折中,推荐
no 交给操作系统决定 可能丢很多(OS 崩溃时) 最快

配置示例:

conf 复制代码
appendonly yes
appendfsync everysec

3.3 AOF 重写(避免文件无限膨胀)

AOF 会记录每一条命令,可能很快变大。比如你 INCR counter 一百次,AOF 会记 100 条命令。重写机制会把它压缩成一条 SET counter 100。

自动触发:auto-aof-rewrite-percentage 100 和 auto-aof-rewrite-min-size 64mb。

也可以手动:BGREWRITEAOF。

3.4 优点 vs 缺点

优点 缺点
数据更安全(最多丢 1 秒) 文件比 RDB 大
写操作实时记录,可读性好(可以 cat 看命令) 恢复速度比 RDB 慢(要逐条执行)
适合做主从复制的备库 频繁 fsync 会影响性能

四、混合持久化(Redis 4.0+)------ 最佳实践

4.1 它是啥?

RDB 恢复快但丢数据多,AOF 安全但恢复慢。混合持久化把两者结合:

  • AOF 文件开头是 RDB 格式的数据(内存快照)
  • 后面追加 AOF 格式的增量命令

4.2 怎么开启

conf 复制代码
aof-use-rdb-preamble yes   # Redis 4.0 开始支持,默认开启

4.3 效果

重启恢复时,先加载 RDB 部分(极快),再重放 AOF 部分的增量命令。既快又安全。

五、怎么选?

场景 推荐方案 理由
缓存服务,丢数据影响不大 仅 RDB,甚至不持久化 性能优先,重启后从 DB 回填
重要数据,不能丢 AOF + everysec 最多丢 1 秒数据
既要性能又要相对安全 混合持久化(默认配置) RDB 快速恢复 + AOF 增量
主从复制架构 都开,但 slave 可不开 AOF 从库承担持久化压力
单纯做消息队列(Streams) AOF + everysec 消息不能丢

个人建议:生产环境都开。主节点开 AOF(everysec)+ RDB,从节点可以只开 RDB。

六、常用运维命令

命令 作用
BGSAVE 后台生成 RDB 快照
BGREWRITEAOF 手动重写 AOF 文件(压缩)
LASTSAVE 查看最后一次成功生成 RDB 的时间戳
INFO persistence 查看持久化状态(rdb_last_save_time、aof_size 等)
CONFIG GET appendonly 查看 AOF 是否开启

欢迎 点赞、关注、转发 ~

有任何疑问,留言区见!🚀

相关推荐
Yeswater11 小时前
从 NIO 到 Netty:五个坑,和一张把它填平的基础设施网
java·后端·netty
福大大架构师每日一题11 小时前
2026-10-18:转换字符串的最小成本Ⅲ。用go语言,给定两个字符串 source 和 target,以及若干条替换规则。每条规则包含一个模式串、一个替换串
后端
韩振方11 小时前
Kubernetes Secret 让数据库密码离开镜像和 Pod 配置
后端
闽林致远11 小时前
基于标准 C++ 的插件化多线程通用数据采集框架|支持自定义业务模块,Oracle/MySQL 入库、FTP 图片上传,Windows/Linux 跨平台部署
后端
doujiaozh11 小时前
协议演进实录:从明文哈希到 AES-GCM 加密,如何平滑升级?
后端·node.js
花卷持续成长11 小时前
慢SQL的整体优化思路
后端·mysql
Sashtok11 小时前
cpp基础知识(4)
后端
Sashtok11 小时前
cpp基础知识(6)
后端
用户21455493101511 小时前
VeapAI 自然语言操作实战|第 02 篇:语义层——把系统讲给模型听的四个构件
前端·后端
斑鸠喳喳11 小时前
期货模式 FutureTask
后端