MST

星途 面试题库

面试题:Redis中RDB文件创建流程的关键步骤有哪些

请详细阐述Redis RDB文件创建过程中涉及到的主要步骤,包括触发条件、数据持久化的具体操作等方面。
38.4万 热度难度
数据库Redis

知识考点

AI 面试

面试题答案

一键面试

触发条件

  1. 手动触发
    • 执行 SAVE 命令:该命令会阻塞Redis服务器,直到RDB文件创建完成。在阻塞期间,服务器无法处理其他客户端请求。
    • 执行 BGSAVE 命令:该命令会fork出一个子进程,由子进程负责创建RDB文件,而主进程继续处理客户端请求。
  2. 自动触发
    • 根据配置文件中的 save 配置触发,例如 save 900 1 表示在900秒(15分钟)内如果至少有1个键被修改,则触发BGSAVE。Redis会定期检查是否满足这些条件,如果满足则自动执行BGSAVE。
    • 当Redis主从复制时,主节点在接收到从节点的 PSYNC 命令进行全量同步时,如果主节点没有在执行BGSAVE,也会自动执行BGSAVE生成RDB文件并发送给从节点。

数据持久化的具体操作(以BGSAVE为例)

  1. fork子进程
    • Redis主进程调用操作系统的 fork 函数创建一个子进程。fork 函数会复制主进程的地址空间等资源,子进程和主进程在这一时刻共享大部分内存数据。这样做的好处是可以快速创建子进程,并且不需要立刻复制大量数据。
  2. 子进程创建RDB文件
    • 子进程打开一个新的RDB文件,一般命名为 dump.rdb(可在配置文件中修改)。
    • 子进程开始遍历当前Redis服务器中的所有数据库,对每个数据库进行如下操作:
      • 写入数据库的SELECT指令(如 SELECT <db_number>),用来标识接下来的数据属于哪个数据库。
      • 遍历数据库中的所有键值对,根据键值对的类型进行不同方式的编码和写入:
        • 字符串类型:直接将字符串的值和长度等信息写入RDB文件。
        • 哈希类型:先写入哈希对象的长度,然后依次写入每个哈希字段和对应的值。
        • 列表类型:先写入列表的长度,再依次写入列表中的每个元素。
        • 集合类型:先写入集合的元素数量,然后依次写入集合中的每个元素。
        • 有序集合类型:先写入有序集合的元素数量,然后对每个元素写入其成员和分值等信息。
  3. 完成RDB文件创建
    • 子进程完成所有数据写入后,关闭RDB文件。
    • 子进程向主进程发送信号告知RDB文件创建完成。主进程收到信号后,可以进行后续处理,例如更新相关的状态信息等。在整个过程中,主进程虽然可以继续处理客户端请求,但如果有写操作发生,Redis采用写时复制(Copy - On - Write,COW)机制,对于被修改的内存页,主进程会复制该页,子进程继续使用原来的页,以保证子进程生成的RDB文件是创建开始时的数据状态。