Redis--COW(Copy On Write)
摘要
问题概述:
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--COW(Copy On Write)相关推荐
- flink redis connector(支持flink sql)
flink redis connector(支持flink sql) 1. 背景 工作原因,需要基于flink sql做redis sink,但bahir 分支的flink connector支持只是 ...
- 写时拷贝(Copy On Write)方案详解
本文旨在通过对 写时拷贝 的四个方案(Copy On Write)分析,让大家明白写时拷贝的实现及原理. 关于浅拷贝与深拷贝,我在之前的博客中已经阐述过了 浅拷贝容易出现指针悬挂的问题,深拷贝效率低 ...
- 性能测试监控搭建:redis监控(grafana+Prometheus+redis_exporter)
性能测试监控搭建:redis监控(grafana+Prometheus+redis_exporter)
- 老唐手把手教你配置security,并增加JWT校验(copy就用)。
老唐手把手教你配置security,并增加JWT校验(copy就用). 1.首先配置security 1.1导入security的jar包 1.2配置security配置文件(直接上代码) 2.JWT ...
- Redis持久化(RDB 和 AOF)
一.RDB持久化 RDB(Redis DataBase): 配置文件中对其的相关配置: 触发机制: 恢复rdb文件: 优点: 缺点: 二.AOF持久化 AOF(Append Only File): 配 ...
- Acwing:COW(DP+状态机 Python)
奶牛贝茜在她最喜欢的牧场中发现了一块石碑,上面刻有神秘的碑文. 碑文的文字似乎来自一种神秘的古代语言,可看作一个只包含 C,O,W三种字符的字符串. 尽管贝茜无法解密该文字,但是她很欣赏 C,O,W按 ...
- 手把手教你配置Redis主从复制(含详细图文)
前言 这期来聊聊什么是主从复制?主从复制能干什么?Redis如何实现的主从复制?哨兵模式如何实现?最后再来说说复制的原理以及他的缺点,如果还没安装Redis的同学可以先去看一下 <手把手教你在L ...
- Redis泛泛而谈(详细3W字)深入浅出Redis,十年阿里架构师分享:有了它还怕不懂Redis原理?
本文适合于刚接触redis的,文章内容比较基础,大佬请绕道. 一.NoSQL入门和概述 Ⅰ-入门概述 1.为什么用NoSQL 1)单机MySQL的美好年代 在90年代,一个网站的访问量一般都不大,用单 ...
- 操作系统(COPY自wk)
操作系统 操作系统(英语:Operating System,缩写:OS)是管理计算机硬件与软件资源的系统软件,同时也是计算机系统的内核与基石.操作系统需要处理如管理与配置内存.决定系统 ...
- 遗传算法(GA)附Matlab代码(copy能用)寻优算法
总的来说就是广撒网,选择性捕捞(代码在最下方,理论知识到处都有,代码才是最实在的) 遗传算法用途 主要用于寻找目标函数最优解(最大,最小值) 相对退火法,遗传算法更有可能跳出局部最优解,得到全局最优解 ...
最新文章
- MIT最新报告:完全无人驾驶仍需10年,马斯克:特斯拉已经实现
- 深度解析:mPaaS 3.0全新组件
- 腾讯科技改版 新闻帝国必经之路
- math.floor java_Java Math.floor() 方法
- 前端使用react-intl-universal进行国际化
- JDBC连接(MySql)数据库步骤,以及查询、插入、删除、更新等十一个处理数据库信息的功能。...
- php+条件限定符,const 限定符
- java 8 list和数组之间的相互转换
- 如何在CDH5.16.2中部署海豚调度器Apache Dolphin Scheduler 1.2.0
- WAF与IPS的区别总结
- 《Java线程池》:任务拒绝策略
- android屏幕适配无效_Android 屏幕适配终结者
- linux集群常用文件拷贝命令
- 如何分享带淘宝客的链接到新浪微博
- java画好看坦克_java绘图,画坦克
- DDNS的NAT穿越问题
- 曾做erp开发工程师,谈下自己的经验
- Hisat2-Stringtie-DESeq2复现Transcript-level expression analysis of RNA-seq experiments with ...
- 图片上传被旋转,golang Exif 判断.jepg图片原始信息Orientation方向,并旋转,
- C盘莫名其妙就满了怎么办?
热门文章
- [leetcode] 740.删除并获得点数
- 计算机网络实验(华为eNSP模拟器)——第七章 远程终端协议(远程登陆)
- 普通平键的主要尺寸有_艾创米:解密指纹锁锁体尺寸测量方法
- javaI/O之PushbackInputStream
- ActivityGroup 实现分页和自定义标签(内有GridView的点击背景样式的改变方法)
- python调用窗口_如何调用一个函数并在另一个窗口中打开?
- oracle asm盘符变了,使用multipath创建ASM磁盘的奇怪现象
- python16进制转2进制流_将十六进制文件转换为二进制文件
- rf调用的python函数报错_Robot Framework(15)- 扩展关键字
- php内置类,yii2学习教程之5种内置行为类详解