2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

为什么 Redis 快照使用子进程 (三)

  • 2019-12-26
  • 本文字数:1404 字

    阅读完需:约 5 分钟

为什么 Redis 快照使用子进程 (三)

写时拷贝(Copy-on-Write)的出现就是为了解决这一问题,就像我们在这一节开头介绍的,写时拷贝的主要作用就是将拷贝推迟到写操作真正发生时,这也就避免了大量无意义的拷贝操作。在一些早期的 *nix 系统上,系统调用 fork 确实会立刻对父进程的内存空间进行复制,但是在今天的多数系统中,fork 并不会立刻触发这一过程:



fork 函数调用时,父进程和子进程会被 Kernel 分配到不同的虚拟内存空间中,所以在两个进程看来它们访问的是不同的内存:


  • 在真正访问虚拟内存空间时,Kernel 会将虚拟内存映射到物理内存上,所以父子进程共享了物理上的内存空间;

  • 当父进程或者子进程对共享的内存进行修改时,共享的内存才会以页为单位进行拷贝,父进程会保留原有的物理空间,而子进程会使用拷贝后的新物理空间;


在 Redis 服务中,子进程只会读取共享内存中的数据,它并不会执行任何写操作,只有父进程会在写入时才会触发这一机制,而对于大多数的 Redis 服务或者数据库,写请求往往都是远小于读请求的,所以使用 fork 加上写时拷贝这一机制能够带来非常好的性能,也让 BGSAVE 这一操作的实现变得非常简单。

总结

Redis 实现后台快照的方式非常巧妙,通过操作系统提供的 fork 和写时拷贝的特性轻而易举的就实现了这个功能,从这里我们就能看出作者对于操作系统知识的掌握还是非常扎实的,大多人在面对类似的场景时,想到的方法可能就是手动实现类似『写时拷贝』的特性,然而这不仅增加了工作量,还增加了程序出现问题的可能性。


到这里,我们简单总结一下 Redis 为什么在使用 RDB 进行快照时会通过子进程的方式进行实现:


  1. 通过 fork 创建的子进程能够获得和父进程完全相同的内存空间,父进程对内存的修改对于子进程是不可见的,两者不会相互影响;

  2. 通过 fork 创建子进程时不会立刻触发大量内存的拷贝,内存在被修改时会以页为单位进行拷贝,这也就避免了大量拷贝内存而带来的性能问题;


上述两个原因中,一个为子进程访问父进程提供了支撑,另一个为减少额外开销做了支持,这两者缺一不可,共同成为了 Redis 使用子进程实现快照持久化的原因。到最后,我们还是来看一些比较开放的相关问题,有兴趣的读者可以仔细思考一下下面的问题:


  • Nginx 的主进程会在运行时 fork 一组子进程,这些子进程可以分别处理请求,还有哪些服务会使用这一特性?

  • 写时拷贝其实是一个比较常见的机制,在 Redis 之外还有哪里会用到它?


如果对文章中的内容有疑问或者想要了解更多软件工程上一些设计决策背后的原因,可以在博客下面留言,作者会及时回复本文相关的疑问并选择其中合适的主题作为后续的内容。

Reference

相关文章


本文转载自 Draveness 技术博客。


原文链接:https://draveness.me/whys-the-design-redis-bgsave-fork


2019-12-26 17:271110

评论

发布
暂无评论
发现更多内容

Arthas vmoption(查看和修改 JVM里诊断相关的option)

刘大猫

JVM 监控 Arthas 监控工具 vmoption

【AI流程应用】智能知识库搭建与实战应用

JEECG低代码

AI应用 流程编排 JeecgBoot #AIGC AI 大模型

构建安全护盾:HarmonyOS 应用的数据安全审计与日志管理实战

网罗开发

鸿蒙 HarmonyOS HarmonyOS NEXT

2025 年 6 个最佳开源工单系统推荐

NocoBase

开源 低代码 无代码 工单系统 IT工单管理

VMware ESXi 7.0 U3v 下载 - 领先的裸机 Hypervisor

sysin

esxi

HarmonyOS NEXT 中级开发笔记:电竞直播应用ArkUI实践

chengxujianke

AI 极客低代码平台快速上手 -- 生成Java代码

华哥的全栈次元舱

Java Python vuetify 纯血鸿蒙 AIGC低代码平台

VMware vSphere 7.0 Update 3v 下载 - 数据中心虚拟化和云原生平台

sysin

esxi

VMware vCenter Server 7.0U3v 下载 - 集中管理 vSphere 环境

sysin

esxi

HarmonyOS NEXT 中级开发笔记:基于ArkUI方舟开发框架的家庭菜谱应用实践

chengxujianke

HarmonyOS NEXT 中级开发笔记:ArkUI在汽车智驾类应用中的实践

chengxujianke

数据要素配置如何驱动城市经济韧性的多元模式

郑州埃文科技

数据要素

什么是SDK集成,与API有什么区别?白板SDK集成攻略分享!

职场工具箱

sdk 在线白板 办公软件 SDK 教程 AIGC

采用XIRAID引擎和Kioxia PCIe5驱动器的虚拟环境中PostgreSQL的高性能存储解决方案

Sergey Platonov

性能测试 高性能计算, 数据库· 安装指南

电脑浓雾之上,一轮鸿蒙之火

脑极体

AI

什么是实时流数据?核心概念与应用场景解析

镜舟科技

数据采集 StarRocks 流批一体 OLAP 数据库 实时流数据

HarmonyOS NEXT 中级开发笔记:ArkUI实现电影票务应用界面

chengxujianke

Gemini 刚发布的「主动音频」和「主动视频」是什么?对谈 Project Astra 主管

RTE开发者社区

HarmonyOS NEXT 中级开发笔记:基于ArkUI的减脂膳食应用界面实践

chengxujianke

HarmonyOS NEXT 中级开发笔记:ArkUI实现短剧播放器界面

chengxujianke

AI 极客低代码平台快速上手 -- 生成Vuetify代码

华哥的全栈次元舱

Java Python 低代码平台 vuetify 纯血鸿蒙

HarmonyOS 如何实现传输中的数据加密

网罗开发

鸿蒙 开发工具 HarmonyOS HarmonyOS NEXT 实践分享

全球第一 AI 录音笔品牌,如何搭建运营与客服系统?

NocoBase

开源 AI 低代码 无代码 客服系统

Gemma 3n 新增音视频理解,可在手机运行;Gemini Live API 升级主动音视频,能记录关键事件和适时回应丨日报

RTE开发者社区

VMware ESXi 7.0U3v macOS Unlocker & OEM BIOS 2.7 标准版和厂商定制版

sysin

esxi

VMware ESXi 7.0U3v macOS Unlocker & OEM BIOS 2.7 集成网卡驱动和 NVMe 驱动 (集成驱动版)

sysin

esxi

HarmonyOS NEXT 中级开发笔记:ArkUI实现演唱会票务页面

chengxujianke

AI 极客低代码平台快速上手 --生成Python代码

华哥的全栈次元舱

Java Python vuetify 纯血鸿蒙 AIGC低代码平台

AI 极客低代码平台快速上手 -- 生成鸿蒙代码

华哥的全栈次元舱

低代码平台 vuetify 纯血鸿蒙 AI极客 AIGC低代码平台

Arthas jvm(查看当前JVM的信息)

刘大猫

人工智能 JVM 监控 Arthas 监控工具

HarmonyOS NEXT 中级开发笔记:ArkUI实现泊车助手UI布局

chengxujianke

为什么 Redis 快照使用子进程 (三)_语言 & 开发_Draveness_InfoQ精选文章