摘要

问题概述:
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)相关推荐

  1. flink redis connector(支持flink sql)

    flink redis connector(支持flink sql) 1. 背景 工作原因,需要基于flink sql做redis sink,但bahir 分支的flink connector支持只是 ...

  2. 写时拷贝(Copy On Write)方案详解

    本文旨在通过对 写时拷贝 的四个方案(Copy On Write)分析,让大家明白写时拷贝的实现及原理. 关于浅拷贝与深拷贝,我在之前的博客中已经阐述过了  浅拷贝容易出现指针悬挂的问题,深拷贝效率低 ...

  3. 性能测试监控搭建:redis监控(grafana+Prometheus+redis_exporter)

    性能测试监控搭建:redis监控(grafana+Prometheus+redis_exporter)

  4. 老唐手把手教你配置security,并增加JWT校验(copy就用)。

    老唐手把手教你配置security,并增加JWT校验(copy就用). 1.首先配置security 1.1导入security的jar包 1.2配置security配置文件(直接上代码) 2.JWT ...

  5. Redis持久化(RDB 和 AOF)

    一.RDB持久化 RDB(Redis DataBase): 配置文件中对其的相关配置: 触发机制: 恢复rdb文件: 优点: 缺点: 二.AOF持久化 AOF(Append Only File): 配 ...

  6. Acwing:COW(DP+状态机 Python)

    奶牛贝茜在她最喜欢的牧场中发现了一块石碑,上面刻有神秘的碑文. 碑文的文字似乎来自一种神秘的古代语言,可看作一个只包含 C,O,W三种字符的字符串. 尽管贝茜无法解密该文字,但是她很欣赏 C,O,W按 ...

  7. 手把手教你配置Redis主从复制(含详细图文)

    前言 这期来聊聊什么是主从复制?主从复制能干什么?Redis如何实现的主从复制?哨兵模式如何实现?最后再来说说复制的原理以及他的缺点,如果还没安装Redis的同学可以先去看一下 <手把手教你在L ...

  8. Redis泛泛而谈(详细3W字)深入浅出Redis,十年阿里架构师分享:有了它还怕不懂Redis原理?

    本文适合于刚接触redis的,文章内容比较基础,大佬请绕道. 一.NoSQL入门和概述 Ⅰ-入门概述 1.为什么用NoSQL 1)单机MySQL的美好年代 在90年代,一个网站的访问量一般都不大,用单 ...

  9. 操作系统(COPY自wk)

    操作系统         操作系统(英语:Operating System,缩写:OS)是管理计算机硬件与软件资源的系统软件,同时也是计算机系统的内核与基石.操作系统需要处理如管理与配置内存.决定系统 ...

  10. 遗传算法(GA)附Matlab代码(copy能用)寻优算法

    总的来说就是广撒网,选择性捕捞(代码在最下方,理论知识到处都有,代码才是最实在的) 遗传算法用途 主要用于寻找目标函数最优解(最大,最小值) 相对退火法,遗传算法更有可能跳出局部最优解,得到全局最优解 ...

最新文章

  1. MIT最新报告:完全无人驾驶仍需10年,马斯克:特斯拉已经实现
  2. 深度解析:mPaaS 3.0全新组件
  3. 腾讯科技改版 新闻帝国必经之路
  4. math.floor java_Java Math.floor() 方法
  5. 前端使用react-intl-universal进行国际化
  6. JDBC连接(MySql)数据库步骤,以及查询、插入、删除、更新等十一个处理数据库信息的功能。...
  7. php+条件限定符,const 限定符
  8. java 8 list和数组之间的相互转换
  9. 如何在CDH5.16.2中部署海豚调度器Apache Dolphin Scheduler 1.2.0
  10. WAF与IPS的区别总结
  11. 《Java线程池》:任务拒绝策略
  12. android屏幕适配无效_Android 屏幕适配终结者
  13. linux集群常用文件拷贝命令
  14. 如何分享带淘宝客的链接到新浪微博
  15. java画好看坦克_java绘图,画坦克
  16. DDNS的NAT穿越问题
  17. 曾做erp开发工程师,谈下自己的经验
  18. Hisat2-Stringtie-DESeq2复现Transcript-level expression analysis of RNA-seq experiments with ...
  19. 图片上传被旋转,golang Exif 判断.jepg图片原始信息Orientation方向,并旋转,
  20. C盘莫名其妙就满了怎么办?

热门文章

  1. [leetcode] 740.删除并获得点数
  2. 计算机网络实验(华为eNSP模拟器)——第七章 远程终端协议(远程登陆)
  3. 普通平键的主要尺寸有_艾创米:解密指纹锁锁体尺寸测量方法
  4. javaI/O之PushbackInputStream
  5. ActivityGroup 实现分页和自定义标签(内有GridView的点击背景样式的改变方法)
  6. python调用窗口_如何调用一个函数并在另一个窗口中打开?
  7. oracle asm盘符变了,使用multipath创建ASM磁盘的奇怪现象
  8. python16进制转2进制流_将十六进制文件转换为二进制文件
  9. rf调用的python函数报错_Robot Framework(15)- 扩展关键字
  10. php内置类,yii2学习教程之5种内置行为类详解