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 工作原理

每一条写命令SETHSETLPUSH 等),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 100auto-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 是否开启

欢迎 点赞、关注、转发

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

相关推荐
Trouvaille ~1 小时前
【Redis】Redis 持久化:RDB 与 AOF 深度解析
redis·中间件·持久化·aof·后端开发·rdb·基础入门
l1t1 小时前
DeepSeek总结的使用 PEG 实现运行时可扩展的 SQL 解析器
数据库·sql
这个DBA有点耶1 小时前
COUNT进阶(续):超大表去重计数的极致优化
数据库·架构·代码规范
爱喝水的鱼丶1 小时前
SAP-ABAP:SAP 简单报表输出开发系列(共6篇) 第四篇:SAP 报表异常处理机制:数据校验与消息提示规范落地
开发语言·数据库·学习·算法·sap·abap
_1_71 小时前
SQL SERVER闪退问题解决
数据库·sqlserver
ZengLiangYi2 小时前
sql.js WASM 深度解析
javascript·数据库·后端
一 乐2 小时前
人口老龄化社区服务与管理平台|基于springboot+vue的人口老龄化社区服务与管理平台(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·人口老龄化社区服务与管理平台
梓䈑2 小时前
【MySQL】表的操作(数据表的创建、查看 和 修改)
数据库·mysql
小碗羊肉3 小时前
【Redis | 第六篇】Redisson
数据库·redis·缓存