为什么redis在进行持久化存储的过程中使用Fork

news/2025/2/28 2:00:56/文章来源:https://www.cnblogs.com/gqfx/p/18742450

Redis 在持久化存储过程中使用 Fork(创建子进程)的核心目的是为了实现 数据一致性非阻塞式持久化。以下是详细解释:


1. 为什么需要 Fork?

Redis 的持久化方式主要有两种:RDB(快照)AOF(追加日志)。无论是哪种方式,持久化都需要将内存中的数据写入磁盘,而直接在主进程中进行磁盘 I/O 操作会导致 阻塞主线程,影响 Redis 的实时响应能力。
通过 Fork 创建子进程,可以实现以下目标:

  • 非阻塞主进程:子进程负责持久化操作,主进程继续处理客户端请求。
  • 数据一致性:利用操作系统的 Copy-On-Write(COW) 机制,保证持久化的数据是某一时刻的内存一致性快照

2. Fork 的工作原理

步骤分解

  1. 触发持久化:当执行 SAVE(同步阻塞)或 BGSAVE(异步非阻塞)命令时,Redis 主进程调用 fork() 创建一个子进程。
  2. 内存共享:子进程与父进程共享相同的内存数据(通过 COW 机制)。
  3. 写入磁盘:子进程将内存数据序列化到磁盘(如生成 RDB 文件)。
  4. 完成持久化:子进程退出,主进程继续服务请求。

Copy-On-Write(COW)机制

  • 初始状态:子进程与父进程共享同一份内存页。
  • 写时复制:若父进程修改了某块内存数据,操作系统会将该内存页复制一份,子进程仍保留原始数据。
    这意味着子进程看到的是 Fork 瞬间的内存快照,保证了数据一致性。

3. Fork 的优势

  1. 高性能
    • 主进程无需等待磁盘 I/O,几乎无性能损耗(仅在 Fork 时有短暂延迟)。
    • COW 机制避免了全量内存复制,减少内存占用。
  2. 数据一致性
    • 子进程保存的是 Fork 时的内存快照,即使后续主进程修改数据,也不会影响持久化的内容。
  3. 可靠性
    • 子进程独立于主进程,即使 Redis 主进程崩溃,子进程仍能安全完成持久化。

4. 持久化场景中的具体应用

场景 1:RDB 快照生成

  • 执行 BGSAVE 命令时,主进程调用 fork() 创建子进程。
  • 子进程将内存数据序列化为 RDB 文件。
  • 优势:主进程无阻塞,客户端请求正常处理;RDB 文件保存的是某一时刻的一致性数据。

场景 2:AOF 重写

  • 当 AOF 文件过大时,Redis 执行 BGREWRITEAOF,创建子进程重写 AOF 文件。
  • 子进程基于当前内存数据生成新的 AOF 文件(记录数据重建的最小命令集)。
  • 优势:主进程继续处理请求,重写期间的新命令会同时写入新旧 AOF 文件缓冲区。

5. Fork 的潜在问题与优化

问题

  • 内存压力:若父进程在 Fork 后频繁修改数据,COW 机制会导致内存页复制,可能增加内存占用。
  • Fork 延迟:当 Redis 内存数据量很大时,fork() 调用可能耗时较长(尤其在虚拟内存管理较慢的系统上)。

优化方法

  1. 控制内存大小:避免单实例内存过大(如超过 10GB),或使用分片集群。
  2. 选择合适持久化方式
    • RDB:适合对数据一致性要求不高,允许少量丢失的场景(如备份)。
    • AOF:通过 appendfsync everysec 平衡性能和数据安全。
  3. 使用混合持久化(Redis 4.0+):结合 RDB 和 AOF 的优势,定期生成 RDB 快照,同时记录增量 AOF 日志。

6. 总结

场景 Fork 的作用
RDB 快照生成 子进程基于 COW 机制生成一致性快照,主进程无阻塞。
AOF 重写 子进程重写 AOF 文件(如 BGREWRITEAOF),压缩日志大小,减少磁盘占用。
高可用性保障 持久化过程中主进程持续服务,避免服务中断。

通过 Fork + COW,Redis 在保证高性能的同时,实现了数据持久化的可靠性和一致性。理解这一机制有助于合理配置 Redis 的持久化策略,平衡性能与数据安全。

COW:写时复制

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/890951.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【phpstudy】phpstudy的MySQL服务启动不了?一启动就自动停止怎么办?

遇到一个问题,就是phpstudy的MySQL服务启动不了,一启动就自动停止。 很明显是端口被占用,还要删除本地的MySQL。 按照以下步骤皆可解决: 第一步:查询mysql服务、然后删除 sc query mysqlsc delete mysql第二步:查看端口情况 netstat -ano | findstr 3306查询为空即可。 如…

[Python] Jupyter NoteBook : 开源的交互式 Python Web 应用程序

概述:Jupyter Notebook 简介Jupyter Notebook是一个开源的Web应用程序,允许用户创建和共享包含实时代码、方程、可视化和解释性文本的文档。它最初由IPython团队开发,现在已经成为一个独立的项目,并广泛用于数据清理和转换、数值模拟、统计建模、数据可视化、机器学习等等。…

【SSH实战】巧用 SSH 打通外网限制

在工作中遇到此场景,如下两条网络限制下,总部如何访问分公司内部web服务器?dmz服务器可以访问总部外网服务器22端口,不可以访问web服务器; web服务器不可访问公网,但是到dmz网络无限制。初看需求,我们第一个想到的肯定是内网端口映射到公网,或者vpn,但是不修改网络策略…

Java Web - 项目

Java Web 项目中学到的相关知识: RESTful, Apifox, 三层架构, 日志技术, 数据库多表操作, 事务管理, 阿里云 OSS 文件上传, 全局异常处理, 登录认证 (JWT, 拦截器), AOP(实现日志管理)Java Web - 项目 准备工作 开发模式 当前主流开发模式: 前后端分离 前后端分离, 如何知道前后…

【Linux部署】Linux环境下Java项目Jar包的启动指令

在Java开发领域,我们经常需要将编译好的Java应用程序打包成Jar文件,以便于部署和运行。 特别是在Linux服务器上,管理多个Jar包的启动和停止是日常运维中的重要一环。 本文介绍如何在Linux环境下高效地启动和管理Jar包,同时提供简洁明了的代码示例,帮助大家更好地理解这一过…

手把手教你用 MicroPython 玩转幻尔串口舵机,代码+教程全公开

MicroPython串口舵机库,支持幻尔科技全系列舵机,支持mpremote工具一键导入,28条指令全测试。原文链接: FreakStudio的博客 摘要 MicroPython串口舵机库,支持幻尔科技全系列舵机,支持mpremote工具一键导入,28条指令全测试。 往期推荐: 学嵌入式的你,还不会面向对象??…

Plombery:将Python脚本的执行与Web界面的可视化监控完美结合的Python任务调度工具

还在为定时运行Python脚本而苦恼吗?还在为复杂的调度系统而头疼吗?今天,就让Plombery帮你解决这些问题!Plombery是一个简单易用的Python任务调度器,拥有友好的Web界面和REST API,让你轻松管理和监控你的Python脚本。告别复杂的配置和代码,Plombery将带你进入高效、便捷的…

AQS的acquire(int arg) 方法底层源码

一、定义 acquire(int arg) 是 AQS(AbstractQueuedSynchronizer)中的一个核心方法,用于在独占模式下获取同步状态。如果当前线程无法获取同步状态,则将其加入等待队列并阻塞,直到成功获取同步状态或被中断 1、acquire(int arg) 方法的作用功能:尝试获取同步状态(独占模式…

【钓鱼邮件】春节复工近期常见的钓鱼邮件

本期主要分享2025年2月常见的钓鱼邮件样本,特别提醒广大用户在春节复工高峰期加强安全防范。 补贴类钓鱼邮件 春节之后,五险一金补贴、年终奖补贴相关的钓鱼邮件依旧频发。钓鱼手法也有所提升,攻击者通常将通知内容放到附件中,并且对附件设置访问密码,试图绕过反垃圾系统检…

HTTP协议与RESTful API实战手册(终章):构建企业级API的九大秘籍

title: HTTP协议与RESTful API实战手册(终章):构建企业级API的九大秘籍 🔐 date: 2025/2/28 updated: 2025/2/28 author: cmdragon excerpt: 🏭 本文作为系列终章,通过物流管理系统的案例,揭秘API开发的完整流程。你将掌握: 深度解读28个HTTP协议进阶特性(ETag/CO…

第一周实验:二次开发

来源 来自大一舍友C++大作业。该项目模拟了一个图书管理系统,涉及到用户对于书籍的查看、借阅与归还,管理员对于书籍相关信息的增删改查。 运行环境+运行结果的截图 运行环境:Windows 11 + Visual Studio 2022main.cpp #include<Windows.h> #include "Account.h&…

学习笔记之day02 Linux-基础篇-系统安装

​1、操作系统简介操作系统:人与计算机硬件交互的中介Linux:内核+Shell +扩展软件Windows:内核+explorer.exe+软件类比法:计算机硬件 -- 内核 == 蛋黄 / Shell == 蛋清 / 外围应用程序 == 蛋壳常见的操作系统:Windows、Linux、DOS、UnixLinux操作系统开放源代码、可以自由…