notesArea/Redis/Redis 的持久化机制.md

Redis 的持久化机制

Redis 提供了两种持久化机制,分别是 RDB 和 AOF。

RDB

定期将内存中的数据保存到磁盘上。优点是快照小,恢复快,适合备份和容灾恢复。缺点是,在下一次持久化前,如果发生故障可能丢失数据。

可以通过 savebgsave 命令手动触发保存操作。前者在当前进程操作,因此会阻塞进程。后者通过 fork 子进程,由子进程操作,因此阻塞主进程的时间(fork 子进程的时间)会很小。

自动触发 RDB 持久化的场景:

  • 使用 save 相关配置,如 save m n。表示 m 秒内数据存在 n 次修改时,自动触发 bgsave
  • 节点执行全量复制操作,主节点执行 bgsave 生成 RDB 文件发送给从节点
  • 执行 debug reload 命令重新加载 Redis 时
  • 执行 shutdown 命令且没有开启 AOF 持久化功能时,自动执行 bgsave

AOF

将写操作追加到 AOF 文件尾部。这样当 Redis 重启时,可以通过 AOF 文件来恢复数据。优点是更细粒度的数据恢复,更高的数据可靠性,适合做数据存档和数据备份。缺点是文件占用空间大,写操作导致磁盘负载比较高,当数据集较大时,比 RDB 启动效率低(RDB 直接恢复数据,AOF 通过再次执行写操作恢复数据)。

工作流程如下:

  1. 写入命令追加到 aof_buf 缓冲区中
  2. 缓冲区根据对应的策略,持久化到硬盘
  3. 定期对 AOF 进行重写,以达到压缩文件的目的
  4. 当 Redis 重启时,通过加载 AOF 文件进行数据恢复

Redis 启动加载数据流程

将 RDB 或 AOF 文件拷贝到 Redis 数据目录下。

  1. 如果开启 AOF 且存在 AOF 文件,则加载 AOF 文件
  2. 如果开启 RDB 且存在 RDB 文件,则加载 RDB 文件
  3. 加载 AOF 或 RDB 文件成功后,Redis 启动成功
  4. AOF 或 RDB 文件存在错误,Redis 启动失败并打印错误信息

混合持久化

Redis4.0 推出了 RDB-AOF 混合持久化机制。在开启持久化的时间内,在 AOF 文件头写入 RDB 数据,在文件尾追加 AOF 数据。在该机制下,AOF 只记录开启持久化的时间段内的操作,由全量改为增量,大大减少了文件的大小。

开头为 RDB 格式,使得 Redis 启动更快,同时结合 AOF,减少大量数据丢失的风险。缺点是在 AOF 文件中增加 RDB 数据,会让 AOF 文件的可读性降低,也不支持旧版本。

大纲
文件