redis数据持久化RDB/AOF机制特点

Redis 提供了两种主要的数据持久化机制:RDB(Redis Database Backup)和AOF(Append-Only File)。它们分别通过不同的方式将内存中的数据保存到磁盘,以防止数据丢失,并在服务器重启时恢复数据。


RDB(快照持久化)

定义

RDB 是 Redis 将内存中某一时刻的数据快照(snapshot)以二进制格式保存到磁盘的文件。默认文件名是 dump.rdb

工作原理

  • Redis 通过触发快照操作(手动或自动)生成 RDB 文件。
  • 保存时,Redis 会 fork 一个子进程,子进程将当前内存数据写入临时文件,完成后替换旧的 RDB 文件,主进程在此期间不阻塞。
  • 数据以压缩的二进制格式存储,体积较小。

触发方式

  1. 手动触发
    • SAVE:同步保存,主线程阻塞,不推荐生产环境使用。
    • BGSAVE异步保存,由子进程完成,主线程继续处理请求。
  2. 自动触发
    • 配置 save <seconds> <changes>,例如 save 900 1(900秒内至少1次变更触发)。
    • 主从复制时的全量同步。
    • 执行 SHUTDOWNBGREWRITEAOF 时。

优点

  • 高效性:RDB 文件是压缩的二进制格式,体积小,适合备份和传输。
  • 恢复快:加载 RDB 文件比 AOF 重放快得多,适合快速重启。
  • 性能影响小:通过 fork 子进程保存,主线程不阻塞。

缺点

  • 数据丢失风险:RDB 是定时快照,两次快照间的数据可能丢失,尤其在服务器崩溃时。
  • fork 成本:在数据量大时,fork 子进程可能导致短暂性能抖动。

适用场景

  • 对少量数据丢失不敏感的场景。
  • 用于冷备份或灾难恢复。
  • 主从复制的初始同步。

AOF(日志持久化)

定义

AOF 通过将每个写命令以追加的方式记录到文件中(默认文件名 appendonly.aof),类似于操作日志。重启时,Redis 通过重放这些命令恢复数据。

工作原理

  • 每次写操作(如 SET、DEL)都会以 Redis 协议格式追加到 AOF 文件。
  • 为避免文件过大,Redis 支持 AOF 重写(rewrite),生成一个精简的命令集表示当前数据。

同步策略

AOF 提供了三种写回磁盘的选项(通过 appendfsync 配置):

  1. **no**:由操作系统决定何时同步,性能最高,但数据丢失风险大。
  2. **everysec**(默认):每秒同步一次,折中方案,最多丢 1 秒数据。
  3. **always**:每次写操作都同步,数据最安全,但性能最低。

AOF 重写

  • 手动触发BGREWRITEAOF 命令。
  • 自动触发:通过配置 auto-aof-rewrite-percentageauto-aof-rewrite-min-size(例如文件增长 100% 且大于 64MB 时触发)。
  • 重写时,fork 子进程生成新的 AOF 文件,主进程继续记录新命令,完成后合并。

优点

  • 数据安全性高:特别是 everysecalways 模式,数据丢失极少。
  • 可读性强:AOF 文件是纯文本格式,便于理解和修改。
  • 灵活性:支持不同同步策略,适应多种需求。

缺点

  • 文件体积大:相比 RDB,AOF 文件通常更大,尤其是未重写时。
  • 恢复慢:重启时需要逐条执行命令,数据量大时恢复速度慢。
  • 性能开销:频繁写磁盘(尤其 always 模式)会影响性能。

适用场景

  • 对数据一致性要求高的场景。
  • 需要最小化数据丢失的应用。
  • 配合重写机制优化存储空间。

RDB 与 AOF 的对比

特性 RDB AOF
持久化方式 快照,某一时刻的内存镜像 日志,记录每次写操作
文件大小 小(压缩二进制) 大(文本,需重写优化)
恢复速度 慢(需重放命令)
数据安全性 较低(可能丢数据) 高(取决于同步策略)
性能影响 低(fork 子进程) 较高(频繁写磁盘)
使用场景 备份、快速恢复 高一致性需求

混合模式(Redis 4.0+)

Redis 4.0 引入了混合持久化(默认关闭,需配置开启),结合 RDB 和 AOF 的优点:

  • AOF 文件以 RDB 格式开头(全量快照),后面追加增量写命令。
  • 重启时先加载 RDB 部分,再重放少量 AOF 命令,兼顾恢复速度和数据安全性。

开启方式

在配置文件中设置:

aof-use-rdb-preamble yes

总结建议

  • 优先使用 AOF:如果数据安全性是首要考虑,建议开启 AOF(appendonly yes),配合 everysec 同步策略。
  • 配合 RDB:定期生成 RDB 文件用于备份或快速恢复。
  • 混合模式:在 Redis 4.0+ 上启用混合持久化,平衡性能和安全性。