十一、redis 入门 之 数据持久化

一、概述

Redis 的 RDB(Redis Database)AOF(Append Only File) 是两种核心持久化机制,用于将内存中的数据持久化到磁盘,避免服务重启后数据丢失

RDB

RDB 是一种 快照式 持久化方式:通过周期性生成内存中 全量数据的二进制快照文件(.rdb 文件),将某一时刻的完整数据状态保存到磁盘。恢复时直接加载该二进制文件到内存,快速恢复数据。

AOF

AOF 是一种 日志式 持久化方式:通过记录 Redis 所有 写操作命令(如 SET、HSET、LPUSH 等) 到文本文件(.aof 文件),恢复时通过 "重新执行" 文件中的命令,还原数据状态。

二、RDB

1、执行过程

  1. 触发机制

    • 自动触发 :通过 Redis 配置文件(redis.conf)设置触发条件,例如:
      • save 900 1:900 秒内有 1 次键修改,触发 RDB;
      • save 300 10:300 秒内有 10 次键修改,触发 RDB;
      • save 60 10000:60 秒内有 10000 次键修改,触发 RDB。
    • 手动触发 :通过命令主动生成 RDB:
      • SAVE:阻塞 Redis 主线程,直到 RDB 生成完成(不推荐生产环境,会导致服务不可用);
      • BGSAVE:fork 一个子进程负责生成 RDB,主线程继续处理客户端请求(生产环境常用)。
  2. 生成流程

    • 触发后,子进程(或主线程)读取内存中的全量数据;
    • 将数据压缩为二进制格式,写入临时文件;
    • 临时文件生成完成后,替换旧的 .rdb 文件(原子操作,避免文件损坏);
    • 持久化完成,释放资源。
  3. 恢复流程

    • Redis 启动时,若检测到磁盘上有 .rdb 文件,会自动加载该文件到内存;
    • 加载期间 Redis 阻塞客户端请求,加载完成后服务正常对外提供服务。

2、特性

  • 文件格式:二进制文件,体积小、加载速度快(二进制解析效率高于文本);
  • 数据丢失最终一致性------ 两次 RDB 生成间隔内的数据(如刚修改但未触发快照)会丢失;
  • 性能影响
    • 生成时(BGSAVE):fork 子进程会消耗少量内存(复制主线程页表),但主线程无阻塞;
    • 恢复时:阻塞服务,适合数据量不大的场景;
  • 灵活性 :支持通过 stop-writes-on-bgsave-error 配置(默认开启)------ 若 BGSAVE 失败,Redis 停止接收写请求,避免数据不一致。

三、AOF

1、执行过程

AOF 的核心是 "命令记录 - 日志刷盘 - 命令重放",关键依赖 刷盘策略 控制数据安全性:

  1. 命令记录流程

    • 客户端执行写命令,Redis 先执行命令(更新内存数据);
    • 命令被追加到内存中的 AOF 缓冲区(aof_buf)(避免频繁磁盘 I/O);
    • 根据配置的 刷盘策略,将缓冲区数据写入 .aof 文件。
  2. 关键:刷盘策略(配置 appendfsync

    • appendfsync always:每执行 1 条写命令,立即刷盘(最高安全性,但频繁 I/O 导致性能损耗最大);
    • appendfsync everysec:每秒刷盘 1 次(平衡安全性与性能,默认值)------ 最多丢失 1 秒内的数据;
    • appendfsync no:由操作系统决定刷盘时机(最低安全性,性能最好,依赖 OS 缓存,可能丢失大量数据)。
  3. AOF 重写(避免日志文件膨胀)

    • 问题:AOF 文件会随写命令累积而变大(如多次修改同一键,会记录多条 SET 命令),导致恢复变慢;
    • 解决:AOF 重写 ------ 通过 BGREWRITEAOF 命令(或自动触发),fork 子进程将 "内存中当前数据" 转换为 "最少命令集"(如多条 SET key value 合并为 1 条),生成新 .aof 文件,替换旧文件;
    • 自动触发:通过 auto-aof-rewrite-percentage(默认 100%)和 auto-aof-rewrite-min-size(默认 64MB)------ 当 AOF 文件体积比上次重写后大 100%,且当前体积 ≥64MB 时触发。
  4. 恢复流程

    • Redis 启动时,若同时开启 RDB 和 AOF,优先加载 AOF 文件(AOF 数据更完整);
    • 逐行执行 .aof 文件中的命令,还原内存数据(若文件有损坏,可通过 redis-check-aof 工具修复)。

2. 关键特性

  • 文件格式:文本文件(可直接查看命令,便于调试),体积较大(命令 + 参数存储);
  • 数据一致性高一致性 ------ 通过 always 策略可实现 "数据不丢失"(除非磁盘故障);
  • 性能影响
    • 记录时:刷盘策略决定性能(everysec 是生产常用平衡方案);
    • 恢复时:命令逐行执行,数据量越大恢复越慢(比 RDB 慢);
  • 可靠性 :支持 "破损文件修复",通过 redis-check-aof --fix 可移除 AOF 文件中无效的命令。

四、对比

  • 若需 快速备份、灾备传输、数据量小,优先用 RDB;
  • 若需 生产环境高数据一致性、避免数据丢失 ,优先用 AOF(刷盘策略选 everysec);
  • Redis 4.0+ 推荐开启 混合持久化,平衡性能与安全性。

五、混合持久化(Redis 4.0+ 特性)

为结合 RDB 和 AOF 的优势,Redis 4.0 引入 混合持久化 (配置 aof-use-rdb-preamble yes):

  • 原理:AOF 重写时,先将当前内存数据以 RDB 格式写入新 AOF 文件开头,再将重写后的增量命令以 AOF 格式追加到后面;
  • 优势:恢复时 ------ 先快速加载 RDB 部分(全量数据),再执行 AOF 增量命令(补全最新数据),兼顾 "恢复速度" 和 "数据完整性"。