Redis-关于RDB的几点顿悟-COW(Copy On Write)

Redis实战(五):Redis的持久化RDB、fork、copyonwrite、AOF、RDB&AOF混合使用 补充一个知识 缓存:数据可以丢,保证速度。 数据库:数据是绝对不能丢的,保证速度+持久性,内存中的数据是掉电易失的。 存储层: 快照/副本 日志文件 $$优先级高于管道 fork() fork是系统调用,copy on write是内核机制。 写时复制 在fork子进程的时候,只拷贝指针,并不发生内存的复制。 只有当其中的某一个进程试图对该区域进行写操作时,内核就会在物理存储器中为子进程开辟一个新的物理页面,将需要写的区域将父进程的内容复制一份给子进程,然后对新的物理页面进行写操作。 这时就是实现了 阅读详情

摘要

问题概述:
1、RDB的过程中是否会停止对外提供服务?
2、RDB的过程中数据修改了,备份的是修改前的还是修改后的?
3、RDB时是不是先把内容中的所有KV复制一份,保证数据不会被修改?

问题解决:使用Copy On Write 写时复制

详细

在看Redis持久化方式中的RDB方式时,想到了几个问题:

1、 Redis是单线程的,那在RDB的过程中,是不是就没法对外提供服务了?
Redis操作快的一个重要原因是Redis的数据是在内存中存储和操作的,持久化本身是磁盘的IO操作,IO操作又是特别耗时的,RDB备份的过程对Redis来说是挺漫长的,如果Redis没法对外提供服务的话,对Redis的影响是很大的吧;
2、知道备份时不会阻塞对外服务,那在数据备份的过程中,有新的数据变更的操作发生时,备份的是变更前的数据还是变更后的数据呢?
另一个角度:RDB快照的是精确的一个时刻的内存数据呢?还是一段时间内的内存数据?
另一个角度:RDB快照是精确的还是模糊的?
3、既然是数据备份,在开始备份的时候,是不是要把Redis的所有数据现在内存中拷贝一份呢?那样的话平时Redis服务器的内存利用率就不能大于50%了啊?

解答

1、RDB过程中会fork一个子进程,子进程做数据备份操作,主进程继续对外提供服务,所有Redis服务不会阻塞;
2、Copy On Write 机制,备份的是开始那个时刻内存中的数据;
3、Copy On Write 机制不需要把整个内存的数据都复制一份;

Copy On Write 机制

核心思路:fork一个子进程,只有在父进程发生写操作修改内存数据时,才会真正去分配内存空间,并复制内存数据,而且也只是复制被修改的内存页中的数据,并不是全部内存数据;

  • Redis中执行BGSAVE命令生成RDB文件时,本质就是调用Linux中的fork()命令,Linux下的fork()系统调用实现了copy-on-write写时复制;
  • fork()是类Unix操作系统上创建线程的主要方法,fork用于创建子进程(等同于当前进程的副本);
  • 传统的普通进程复制,会直接将父进程的数据拷贝到子进程中,拷贝完成后,父进程和子进程之间的数据段和堆栈是相互独立的;
  • copy-on-write技术,在fork出子进程后,与父进程共享内存空间,两者只是虚拟空间不同,但是其对应的物理空间是同一个;

Linux中CopyOnWrite实现原理

fork()之后,kernel把父进程中所有的内存页的权限都设为read-only,然后子进程的地址空间指向父进程。当父子进程都只读内存时,相安无事。当其中某个进程写内存时,CPU硬件检测到内存页是read-only的,于是触发页异常中断(page-fault),陷入kernel的一个中断例程。中断例程中,kernel就会把触发的异常的页复制一份,于是父子进程各自持有独立的一份。

CopyOnWrite的好处:
1、减少分配和复制资源时带来的瞬时延迟;
2、减少不必要的资源分配;
CopyOnWrite的缺点:
1、如果父子进程都需要进行大量的写操作,会产生大量的分页错误(页异常中断page-fault);

Redis中的CopyOnWrite

  • Redis在持久化时,如果是采用BGSAVE命令或者BGREWRITEAOF的方式,那Redis会fork出一个子进程来读取数据,从而写到磁盘中。
  • 总体来看,Redis还是读操作比较多。如果子进程存在期间,发生了大量的写操作,那可能就会出现很多的分页错误(页异常中断page-fault),这样就得耗费不少性能在复制上。
  • 而在rehash阶段上,写操作是无法避免的。所以Redis在fork出子进程之后,将负载因子阈值提高,尽量减少写操作,避免不必要的内存写入操作,最大限度地节约内存。
来聊聊redis 7的new feature – AOF日志新增时间戳 来聊聊redis 7的new feature – AOF日志新增时间戳 首先,我们要知道这是个什么内容,Github上的讨论有个链接: https://github.com/redis/redis/issues/9326 大体就是讲AOF现在支持时间戳了,你可以做到基于时间点的恢复数据了。 很赞👍 不过,Redis是开源的啊,很多同学对于Redis做了很多二次开发工作,那如果原生的AOF日志格式被修改了,他会不会影响我们现有的其他工具的使用呢? 我们先来简单看看被修改后的AOF日志的格式 首先现在的aof的 阅读详情

相关推荐

Redis持久化(AOF、RDB)用到的写时复制到底是什么

Redis中有两种持久化方式,分别为AOF和RDB,这两种方式都会使用写时复制(Copy on Write),那到底他们是如何工作的呢?本文作为的补充内容,请先看上文在看本文,如以了解可跳过。

我是一名热爱编程和分享知识的技术作者,在金融和教育领域有多年的研发管理经验,感谢您访问我的博客,一定会为您带来不一样的收货! 2576

Redis的RDB执行原理

Redis的RDB执行原理

weixin_46028606的博客 510

华为私有云HCS 8.1.1实战:从镜像制作到云主机发放全流程指南

本文详细解析了华为私有云HCS 8.1.1从镜像制作到云主机发放的全流程实战指南。内容涵盖制作标准化QCOW2镜像、配置云主机规格与主机组、规划外部网络,以及在运营面为租户初始化资源、配置审批流与产品目录。最后,通过用户视角演示了从创建VPC网络到申请、审批并最终绑定EIP访问云主机的完整操作步骤,为运维人员和架构师提供了一套清晰、可落地的HCS部署与管理实践方案。

weixin_29305313的博客 1128

Redis的写时复制(Copy On Write),你真的了解么?

Redis的写时复制(Copy On Write),你真的了解么

u010738038的专栏 1910

【一】Android MediaPlayer整体架构源码分析 -【初始化和创建】

本系列文章分析的安卓源码版本:【Android 10.0 版本】 一、MediaPlayer的简单调用关键流程 【这只是一个简单使用过程示例】 // 此处变量声明省略 private void play() { // 先获取SurfaceHolder mSurfaceView = findViewById(R.id.surface_view); mSurfaceHolder = mSurfaceView.getHolder(); mSurfac

CloverLHao的博客 4347

极化码理论及算法研究4-巴氏参数、GA算法以及matlab仿真

目录 (如要找其他内容,欢迎访问我的主页寻找) #前言 #极化码概述 #极化码定义 #极化码编码 #极化码译码 #5G标准中极化码的编译码概述 #5G标准中极化码的编码 #5G标准中极化码的译码 #总结 极化码编码 ...

1万+

写时复制(Copy On Write)

前言 在读《Redis设计与实现》关于哈希表扩容的时候,发现这么一段话: 执行BGSAVE命令或者BGREWRITEAOF命令的过程中,Redis需要创建当前服务器进程的子进程,而大多数操作系统都采用写时复制(copy-on-write)来优化子进程的使用效率,所以在子进程存在期间,服务器会提高负载因子的阈值,从而避免在子进程存在期间进行哈希表扩展操作,避免不必要的内存写入操作,最大限度地节...

NeoJoe博客 1万+

如何构建智能聊天系统

聊天分为听、思考、读,简单的通过ASR、LLM、TTS三类模型的组合可以实现,最近openai推出支持多模态的GPT-4o模型,可以把三个模型真正融合成在一起。现在市面上的模型百花齐放,各有所长。要实现可落地的方案,需要结合业务,验证模型效果,同时也要考虑方案的可行性,有些模型在国内能用,有些在国内不能用。

xsgnzb的专栏 2108

Redis持久化

Redis持久化 Redis支持RDB和AOF两种持久化机制,持久化功能有效地避免因进程退出造成的数据丢失问题。 RDB RDB持久化是把当前进程数据生成快照保存到硬盘的过程,触发RDB持久化过程分为手动触发和自动触发。 触发机制 手动触发分别对应save和bgsave命令: save命令:阻塞当前Redis服务器,直到RDB过程完成为止,对于内存 比较大的实例会造成长时间阻塞,线上环境不建议使用。运行save命令对应 的Redis日志如下:* DB saved on disk bgsave命令:Re

qq_27502511的博客 928

使用Python下载ECMWF的ERA-5数据

一、注册账号 [官网]https://www.ecmwf.int/ 二、登录后获取下载key https://cds.climate.copernicus.eu/api-how-to 如图右侧红色框中的内容复制保存为TXT文件,并重命名为“.cdsapirc”,注意前面有点,保存在 C:\Users\username\.cdsapirc,(WINDOWS系统),username指当前电脑登录账户。 三、安装cdsapi库 以pycharm为例: 在pycharm中依次打开:File>setting

wise_sun的博客 7706

A2B音频总线在智能座舱中的应用

车载A2B链路音频是智能座舱的核心功能,涵盖车载音响、语音识别、e-Call、消噪及回声消除等应用,随着汽车智能网联化的发展,对音频的开发要求也越来越高,需要加入更先进、功能丰富的信息娱乐功能以满足消费者的用户体验。但传统的模拟并行音频信号传输方式,难以在功能增加与整车轻量化(线缆的重量及成本减少)之间取得均衡。这时候就需要A2B音频总线了。A2B音频总线用于连接车辆中的音频设备,如麦克风(MIC)、功放(AMP)、多媒体主机(Head Unit)和T-BOX等。通过一条低成本的非屏蔽双绞线UTP,进行跨距

怿星科技的博客 3935

redis copy-on-write机制

二. strace工具和redis 的copy-on-write原理 strace : 监控系统内核进程的工具 首先, 讲一个工具strace. Linux的一个进程工具 这个工具的作用是: 用来最终redis的进程 可以参考这个文章: https://www.linuxidc.com/Linux/2018-01/150654.htm 比如,我们要追踪redis启动后的进程 strace -ff -o /usr/local/ooxx/out ./src/redis-server ff: 表示追踪所有的进程和

wejack的专栏 1869

FMCW雷达基本原理(通俗易懂)篇2

FMCW雷达(Frequency Modulated Continuous Wave Radar)是一种使用频率调制连续波的雷达系统。它使用一个发射器发射一个连续波,但是这个连续波的频率会在一定的范围内不断变化。当这个连续波遇到一个目标物体并被反射回来时,接收器会检测到这个反射波的频率变化,并计算出目标物体的距离和速度等信息。FMCW雷达的原理可以理解为:1.发射器发射一个连续波,这个波的频率会从一个固定的起始频率开始,逐渐变化至一个固定的终止频率。

研二小学鸡的博客 7692

Redis-关于RDB的几点顿悟-COW(Copy On Write)【转载】

https://blog.youkuaiyun.com/lh87270202/article/details/106430154

CBeann的博客 483

LLaMA-Factory微调教程2:命令行sft微调

本文介绍了如何使用llama-factory项目在本地运行Qwen2-7B大语言模型进行对话。首先通过llamafactory-cli env查看环境配置,然后使用git lfs下载Qwen2-7B模型。创建配置文件qwen2_7b_instruct.yaml,修改模型路径和模板参数。最后通过llamafactory-cli chat命令启动对话服务,加载模型配置文件和tokenizer,完成环境初始化后即可进行交互式对话。

Cachel Wood的博客 8815

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

redis的rdb持久化的cow技术(写时复制)及fork子进程理解

把当前进程数据生成快照(.rdb)文件保存到磁盘的过程 两种触发方式:手动触发(save命令),自动触发(bgsave命令,推荐) save命令:阻塞当前redis直到rdb持久化完成。若内存实例较大,会造成长时间阻塞,线上环境不建议使用。 bgsave命令:redis进程执行fork操作创建子进程来完成持久化,阻塞时间短(微秒级),save命令的优化。 bgsave触发的条件: 1在redis-cli中执行shutdown关闭redis服务时,如果没有开启aof持久化,自动执行bgsave命令 2redi

qq_33043025的博客 4340

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Redis RDB 持久化机制深入理解:Copy-On-Write 与数据一致性保障

问题回答RDB 保存的是哪个时间点的数据?fork 子进程那一刻(如 11:00)RDB 执行过程中更新数据会污染快照吗?❌ 不会,更新的数据页主进程会 COW,子进程仍持有旧页主进程会合并或清理 COW 数据?❌ 不会,是操作系统自动释放子进程的旧页fork 会增加内存使用吗?✅ 是的,写多了会触发大量 COW,峰值会高于平时内存,需关注。

阿呆的专栏 781

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Redis--COW(Copy On Write)

摘要 问题概述: 1、RDB的过程中是否会停止对外提供服务? 2、RDB的过程中数据修改了,备份的是修改前的还是修改后的? 3、RDB时是不是先把内容中的所有KV复制一份,保证数据不会被修改? 问题解决:使用Copy On Write写时复制 详细 在看Redis持久化方式中的RDB方式时,想到了几个问题: 1、 Redis是单线程的,那在RDB的过程中,是不是就没法对外提供服务了? Redis操作快的一个重要原因是Redis的数据是在内存中存储和操作的,持久化本身是磁盘的IO操作,IO操作又是.

hellozhxy的博客 894

【Redis】---【选举,渐进式Rehash,Copy On Write】

【Redis】--- 总结前言集群选举原理二、使用步骤 前言 总结Redis中理论,面试总结 集群选举原理 当slave发现自己的master变为FAIL状态时,便尝试进行Failover,以期成为新的master。由于挂掉的master可能会有多个slave,从而存在多个slave竞争成为master节点 slave发现自己的master变为FAIL 将自己记录的集群currentEpoch加1,并广播FAILOVER_AUTH_REQUEST 信息 其他节点收到该信息,只有master响应,判断

Abner_G的博客 839

Redis Copy-on-Write机制:

Copy-on-Write机制: 父子进程共享内存页 当父进程修改数据时,内核会复制被修改的页 这可能导致内存使用量暂时增加 通俗的话描述一下可以用一个生活中的例子来通俗解释。

C18298182575的博客 469

redis 的 copy-on-write 机制

我们知道redis的worker是单线程的, 如果要持久化这个行为也放在单线程里, 那么如果需要持久化数据特别多, 将会影响用户的使用. 所以单开一个进程专门来做持久化的操作.肯定是要把redis内存中的数据写入. 这时候, 其实redis内存中的数据保存的是一个虚拟地址. 他真实指向的是物理内存的地址(绿色部分)其实持久化进程这个时候只是指向了数据的地址, 内存消耗并不多. 如果这时候, 原来的数据修改了, 怎么办呢?这时候, 要拷贝, 就是把真实数据的地址拷贝一份到需要持久化的进程中。

Jerry00713的博客 579

redis持久化机制

redis有两种持久化机制:RDB(快照)和AOF(日志) COPY ON WRITE机制:当前数据正在进行处理(比如制作快照或者进行AOF重写)的时候,如果有新的请求需要修改数据,那么就用到了写时复制技术。即将数据复制一份出来,然后在复制的数据上面进行修改。等到前面的处理流程结束后,可以把这份复制出来的数据写回去,或者直接指向这块新的内存。 父进程fork子进程的时候,用到COW,意思是,原本新fork出来的子进程是共享父进程的数据的,只有当父进程或者子进程修改数据的时候,才复制一份出来,在复制的数据上

zhongzhh8的博客 265

redis持久化策略梳理及主从环境下的策略调整记录

在任何时候执行bgrewriteaof命令,都会把当前内存中最短序列的命令写到磁盘,这些命令可以完全构建当前的数据情况,而不会存在多余的变化情况(比如状态变化,计数器变化等),缩小的AOF文件的大小。子进程将最新的AOF写入一个临时文件;-------------再看一例----------------------------------------------------------------------------------------------------------------------

分享技术架构、运维、程序开发经验 283

redis高频面试题

IO多路复用是指利用单个线程来同时监听多个Socket,并在某个Socket可读、可写时得到通知,从而避免无效的等待,充分利用CPU资源。目前的I/O多路复用都是采用的epoll模式实现,它会在通知用户进程Socket就绪的同时,把已就绪的Socket写入用户空间,不需要挨个遍历Socket来判断是否就绪,提升了性能。△。

hayhead的博客 983
上一篇: MySQL索引与Index Condition Pushdown(转载)
下一篇: MySQL Explain详解(转载)
Muscleape
博客等级 码龄10年 9粉丝 23原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值