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 是否开启

欢迎 点赞、关注、转发

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

相关推荐
深盾科技_Virbox1 小时前
软件授权工具静默安装实践
java·运维·数据库·安全·软件需求
AI人工智能+电脑小能手1 小时前
【大白话说Java面试题 第172题】【07_Redis篇】第8题:`setnx` 做分布式锁存在的问题
java·redis·分布式锁·死锁·setnx
延凡科技1 小时前
延凡科技综合监控预警处置平台—— 一体化视频AI安防闭环系统设计与功能实现[特殊字符]️
数据库·人工智能·科技·安全·能源
老马聊技术1 小时前
Rocky Linux 9.0 安装 MySQL8.x详细教程
linux·数据库
醇氧2 小时前
主流 Agent 开发框架全解析(2026 最新)
大数据·数据库·人工智能·开源
吴声子夜歌2 小时前
Redis 6.x——整合SpringBoot
数据库·spring boot·redis
ATA88882 小时前
AI辅助生成SQL实战从连接配置到执行计划优化的完整技术流程
数据库·人工智能·智能问数
咏方舟【长江支流】2 小时前
【开源】跨语言·跨平台·跨数据库(4) ——用宝框架 ORM 数据源适配器
数据库·开源·ai编程·orm·咏方舟-长江支流·用宝框架·用宝框架orm
Rain的Java大神实战圈2 小时前
每日排行榜功能如何设计
redis·架构设计·面试经验·场景设计题
JZC_xiaozhong2 小时前
OA调价审批后,采购调价单如何自动同步到ERP?解决漏录错价难题
大数据·linux·服务器·前端·数据库·数据孤岛解决方案·数据集成与应用集成