跳到主要内容

Redis 持久化与备份

Redis 是一个内存数据库,但为了避免数据丢失,它提供了多种持久化机制,能够将内存中的数据保存在磁盘上。通过合理的持久化和备份策略,Redis 可以在重启或故障后恢复数据,保证数据的持久性和高可用性。

持久化方式

Redis 提供了两种主要的持久化机制:**RDB(Redis 数据库快照)**和 AOF(附加文件),每种方式有其特点和应用场景。

RDB(快照存储)

RDB 是 Redis 默认的持久化方式,它通过生成数据库的快照来保存数据状态。Redis 会在指定的时间间隔内自动创建数据的快照,并将其保存为 .rdb 文件。RDB 快照是一个二进制文件,包含了数据库的完整数据。

优点:

  • 快照保存的是整个数据库的状态,恢复速度快。
  • 支持持久化备份,减少内存使用。

缺点:

  • 数据丢失:RDB 只能在创建快照时保存数据,快照创建之间的数据变动会丢失。
  • 不支持持久化日志:在 Redis 重启时,恢复速度较慢,特别是在数据量大的时候。

常用命令:

  • SAVE:同步保存当前数据库的快照。
  • BGSAVE:异步保存当前数据库的快照,不阻塞主线程。
  • LASTSAVE:查看最后一次保存操作的时间戳。
BGSAVE
SAVE
LASTSAVE

AOF(附加文件)

AOF 是 Redis 另一种持久化方式,通过记录每个写操作命令来持久化数据。当 Redis 重启时,AOF 文件中的所有操作都会被重新执行,恢复到数据库的状态。AOF 文件记录的是所有写操作的日志,支持数据的增量备份。

优点:

  • 数据完整性:AOF 记录了所有的写操作,避免了 RDB 可能的丢失问题。
  • 可配置性:可以设置不同的同步策略,灵活控制性能和持久化的平衡。

缺点:

  • AOF 文件较大:随着时间的推移,AOF 文件会变得越来越大,需要定期进行压缩。
  • 恢复速度较慢:由于记录的是增量操作,AOF 恢复数据时需要逐个执行这些操作。

常用命令:

  • APPENDONLY yes:开启 AOF 持久化。
  • BGREWRITEAOF:后台重写 AOF 文件,以减小文件大小。
  • AOF 文件重写:定期触发 AOF 文件重写操作,避免文件过大。
APPENDONLY yes
BGREWRITEAOF

RDB 与 AOF 的比较

  • 性能:RDB 相较于 AOF 的性能开销较低,适用于数据更新不频繁的场景。而 AOF 需要记录每个写操作,对性能有较大影响,但可以保证数据的完整性。
  • 数据持久性:RDB 在生成快照时,如果发生故障,会丢失快照之间的数据。而 AOF 可以通过记录每个操作命令来尽可能减少数据丢失,提供更高的持久性保障。
  • 恢复速度:RDB 恢复速度较快,因为它只需加载一个完整的快照文件,而 AOF 恢复则需要逐条执行文件中的操作命令,恢复速度较慢。

混合持久化

从 Redis 4.0 开始,Redis 提供了 混合持久化(Hybrid Persistence)模式。混合持久化模式将 RDB 和 AOF 两种持久化方式结合起来,既保留了 RDB 的高效恢复速度,又能利用 AOF 记录每个操作命令,提供更高的数据安全性。

在混合持久化模式下,Redis 会将数据的快照保存在 RDB 文件中,同时将增量操作记录在 AOF 文件中。Redis 启动时,会先加载 RDB 快照文件,然后通过 AOF 文件进行增量数据恢复。

数据备份

在 Redis 中,备份通常是指通过持久化机制将数据保存到磁盘。除了 RDB 和 AOF 文件,Redis 还提供了手动备份的方式。

备份策略

  • 定期备份:定期创建 RDB 快照,可以通过配置 save 参数来设置快照创建的频率。例如,每隔 60 秒,至少有 1000 个键被修改时,Redis 会自动生成一个 RDB 快照。
  • 异步备份:通过 BGSAVE 命令,Redis 会在后台异步生成一个快照,不会阻塞客户端请求。
  • AOF 重写:定期使用 BGREWRITEAOF 命令来重写 AOF 文件,减少文件大小,提高性能。

恢复数据

在 Redis 中恢复数据非常简单。只需要将备份的 RDB 或 AOF 文件复制到 Redis 的数据目录中,然后重新启动 Redis 服务器即可。Redis 会自动加载这些文件并恢复数据。

  • RDB 恢复:如果 Redis 配置使用 RDB 持久化,那么启动时 Redis 会自动加载 .rdb 文件。
  • AOF 恢复:如果 Redis 配置使用 AOF 持久化,Redis 启动时会加载 .aof 文件,并逐条执行文件中的命令。