Administrator
Published on 2025-03-09 / 6 Visits
0
0

Redis 在生成 RDB 文件时如何处理请求

Redis 在生成 RDB 文件时,通过 BGSAVE 命令在后台执行持久化操作,其核心机制如下:


1. 主进程与子进程分工

  • 主进程:继续正常处理客户端请求(包括读和写)。
  • 子进程:由主进程通过 fork() 创建,负责将内存数据写入临时 RDB 文件(完成后替换旧文件)。

2. 写时复制(Copy-On-Write, COW)

  • 原理fork() 创建子进程时,父子进程共享同一内存空间。当主进程修改数据时,操作系统会复制被修改的内存页,子进程仍使用原始内存页。
  • 作用
    • RDB 文件保存的是 fork() 时刻的数据快照,后续写操作不会影响正在生成的 RDB。
    • 写操作由主进程处理,但会触发 COW,可能导致内存占用上升(尤其在大规模写入时)。

3. 请求处理流程

  • 读请求:直接由主进程处理,无影响。
  • 写请求
    1. 主进程正常执行写操作。
    2. 若修改的数据页尚未被子进程写入 RDB,操作系统会复制该页(COW)。
    3. 子进程继续基于原始数据页生成 RDB,主进程处理后续请求。

4. 潜在影响

  • 内存开销:频繁写操作会导致 COW 内存复制,增加内存使用(与修改的数据量正相关)。
  • 短暂延迟fork() 瞬间可能阻塞主进程(尤其在数据量大的实例中),但后续请求处理不受影响。

5. 总结

Redis 通过 BGSAVE + COW 机制实现了 RDB 生成与请求处理的并行:

  • RDB 文件反映的是开始持久化时的数据一致性状态。
  • 服务保持可用,但大规模写入可能增加内存压力。
  • 适合对数据一致性要求高、可接受短暂内存波动的场景。

Comment