Redis 在生成 RDB 文件时,通过 BGSAVE 命令在后台执行持久化操作,其核心机制如下:
1. 主进程与子进程分工
- 主进程:继续正常处理客户端请求(包括读和写)。
- 子进程:由主进程通过
fork()
创建,负责将内存数据写入临时 RDB 文件(完成后替换旧文件)。
2. 写时复制(Copy-On-Write, COW)
- 原理:
fork()
创建子进程时,父子进程共享同一内存空间。当主进程修改数据时,操作系统会复制被修改的内存页,子进程仍使用原始内存页。 - 作用:
- RDB 文件保存的是
fork()
时刻的数据快照,后续写操作不会影响正在生成的 RDB。 - 写操作由主进程处理,但会触发 COW,可能导致内存占用上升(尤其在大规模写入时)。
- RDB 文件保存的是
3. 请求处理流程
- 读请求:直接由主进程处理,无影响。
- 写请求:
- 主进程正常执行写操作。
- 若修改的数据页尚未被子进程写入 RDB,操作系统会复制该页(COW)。
- 子进程继续基于原始数据页生成 RDB,主进程处理后续请求。
4. 潜在影响
- 内存开销:频繁写操作会导致 COW 内存复制,增加内存使用(与修改的数据量正相关)。
- 短暂延迟:
fork()
瞬间可能阻塞主进程(尤其在数据量大的实例中),但后续请求处理不受影响。
5. 总结
Redis 通过 BGSAVE + COW 机制实现了 RDB 生成与请求处理的并行:
- RDB 文件反映的是开始持久化时的数据一致性状态。
- 服务保持可用,但大规模写入可能增加内存压力。
- 适合对数据一致性要求高、可接受短暂内存波动的场景。