Redis 面试题
目录

RDB 持久化是如何工作的?

· 约 3 分钟读完 · 第 18 / 115 章

推荐答案

RDB(Redis Database)持久化是 Redis 提供的一种数据持久化方式,它通过生成数据快照(snapshot)来保存 Redis 在某个时间点的数据状态。RDB 持久化的工作机制如下:

  1. 触发条件:RDB 持久化可以通过手动触发或自动触发。手动触发可以通过执行 SAVE 或 BGSAVE 命令,而自动触发则根据配置文件中的 save 规则来执行。

  2. 生成快照:当 RDB 持久化被触发时,Redis 会创建一个子进程来执行快照的生成工作。父进程继续处理客户端请求,而子进程则负责将内存中的数据写入到一个临时的 RDB 文件中。

  3. 写入磁盘:子进程将内存中的数据以二进制格式写入到临时 RDB 文件中。写入完成后,Redis 会用这个临时文件替换旧的 RDB 文件,确保数据的原子性。

  4. 压缩与优化:RDB 文件是经过压缩的二进制文件,通常比内存中的数据更小,适合用于备份和恢复。

  5. 恢复数据:当 Redis 重启时,如果配置了 RDB 持久化,Redis 会加载最新的 RDB 文件来恢复数据。

本题详细解读

1. 触发条件

RDB 持久化的触发条件可以分为手动触发和自动触发两种:

  • 手动触发:通过执行 SAVE 或 BGSAVE 命令来手动触发 RDB 持久化。SAVE 命令会阻塞 Redis 服务器,直到 RDB 文件创建完成,而 BGSAVE 命令则会在后台异步执行,不会阻塞服务器。

  • 自动触发:Redis 允许在配置文件中设置 save 规则,例如 save 900 1 表示在 900 秒内如果至少有 1 个键被修改,则自动触发 RDB 持久化。可以配置多个 save 规则,Redis 会根据这些规则自动执行 BGSAVE。

2. 生成快照

当 RDB 持久化被触发时,Redis 会创建一个子进程来执行快照的生成工作。这个子进程会遍历 Redis 的内存数据库,将所有的键值对以二进制格式写入到一个临时的 RDB 文件中。由于子进程是父进程的副本,它拥有父进程在创建子进程时的内存数据快照,因此不会受到父进程后续写入操作的影响。

3. 写入磁盘

子进程将内存中的数据写入到临时 RDB 文件后,Redis 会用这个临时文件替换旧的 RDB 文件。这个过程是原子的,确保即使在写入过程中发生崩溃,旧的 RDB 文件也不会被破坏。替换完成后,旧的 RDB 文件会被删除。

4. 压缩与优化

RDB 文件是经过压缩的二进制文件,通常比内存中的数据更小。Redis 使用了一种高效的压缩算法来减少 RDB 文件的大小,这使得 RDB 文件非常适合用于备份和数据恢复。

5. 恢复数据

当 Redis 重启时,如果配置了 RDB 持久化,Redis 会检查是否存在 RDB 文件。如果存在,Redis 会加载这个 RDB 文件来恢复数据。由于 RDB 文件是二进制格式,加载速度通常比 AOF(Append-Only File)持久化方式更快。

6. 优缺点

  • 优点:

    • RDB 文件紧凑,适合用于备份和恢复。
    • 恢复数据时速度较快。
    • 适合大规模数据的持久化。
  • 缺点:

    • RDB 是定时生成快照,可能会丢失最后一次快照之后的数据。
    • 在数据量较大时,生成 RDB 文件可能会占用较多的 CPU 和内存资源。

通过以上机制,RDB 持久化为 Redis 提供了一种高效的数据备份和恢复方式。