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

欢迎 点赞、关注、转发

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

相关推荐
Nturmoils14 小时前
订单列表慢查询,先看 WHERE、ORDER BY 和 LIMIT
数据库
渣波18 小时前
拒绝 SQL 焦虑!手把手带你用 NestJS + Prisma + DTO 写出“防弹”级后端代码
javascript·数据库·后端
倔强的石头_2 天前
KingbaseES 新版MySQL 兼容版体验:旧版迁移 + 功能实测
数据库
用户3169353811835 天前
Java连接Redis
redis
倔强的石头_5 天前
《Kingbase护城河》——数据库存储空间全景探测与精细化瘦身实战
数据库
冬奇Lab5 天前
每日一个开源项目(第134篇):Zvec - 阿里开源的嵌入式向量数据库,向量搜索界的 SQLite
数据库·人工智能·llm
ClouGence6 天前
Oracle CDC 架构优化:从主库直连到 DataGuard 备库同步
数据库·后端·oracle
无响应de神6 天前
三、用户与权限管理
数据库·mysql
小小工匠6 天前
Redis - 事务机制:能实现 ACID 属性吗
数据结构·redis·性能优化·并发·持久化
麦聪聊数据6 天前
数据服务化时代:企业数据能力输出的核心路径
数据库