Redis进阶底层原理- 持久化

news2024/12/23 0:50:02

Redis作为基于内存的缓存数据库,就会存在断电即失的问题,所以数据的持久化是非常重要的。Redis随着版本升级迭代,持久化技术也在不断的升级,(从最开始的RDB,到的Redis1.1版本加入AOF,3.0版本支持RDB和AOF的混合使用,7.0版本也同样做了升级-后续研究)目前主要持久化RDBAOF两种。

1、Fork原理

fork是操作系统的一个系统调用函数,原则是读时共享写时拷贝,主要作用是用来创建一个新的进程,也就是子进程。子进程被创建时会copy父进程所有信息。其中就包括虚拟地址(指向物理地址,用来在内存中找数据),也就是说此时父进程和子进程有这独立的虚拟地址空间,且指向相同的物理地址空间。

 fork子线程方式,节省了重新拷贝一份数据的内存空间,同时在结合copy-on-write策略,实现了极少的内存copy成本完成父子进程内存独立(父子进程修改数据对方不会察觉,也就是内存数据拷贝功能),基本原理如下:

 此时父进程对虚拟地址1的元素进行了修改,会在内存中copy一份元素,并将父进程的虚拟地址指向这个元素物理地址,而子进程依旧指向原来的物理地址。这就是Copy-on-write原则:

 RDB内存快照

        RDB是Redis最早使用持久化技术,简单的说就是不同的时间点,将Redis存储的数据生产快照存储在磁盘上。详细的说,可以通过配置save规则,告知Redis在达到规则时间点后,开始持久化操作,Redis主线程会通过系统调用fork创建一个子进程,被fork出来的子进程,它copy了Redis主进程相关信息,其中就包括虚拟空间地址,同时fork通过copy-on-write原则,实现了Redis主进程和子进程内存数据的写隔离,那子进程会异步的将日志写入到磁盘中,这种技术的好处是,通过写时copy这样的小成本,避免了大量内存数据拷贝带来的内存和效能问题。缺点就是可能在子进程写入磁盘时,发生宕机这样的问题,由于数据是在内存中的,所以会产生一部分数据丢失。

 优点:
1、RDB存储是二进制数据文件,磁盘占用很小,数据恢复速度快,也非常方便做数据的传输,比如做容灾就很适合。
2、RDB数据是紧凑型的,每次持久化都是全量的数据,所以可以通过一些方式做数据备份,比如每天备份一份数据出来。
3、RDB是通过fork形式异步的写入磁盘,同时结合copyonwrite原则,不会影响主进程正常使用,最大化的提高了redis性能。

缺点
1、因为可能是一段时间处理一次,当发生宕机的时候,可能存在一部分数据丢失。
2、如果数据量非常大的时候,fork过程也会有更大的时间消耗。

AOF只追加操作文件

    因为RDB并不是耐久的,在发生宕机之后,可能存在部分数据丢失,所以在1.1版本之后新增了AOF持久化方式,也就是追加的方式写入操作到文件。可以通过配置appendfsync,来配置追加规则,默认是每秒追加一次操作到文件中。当开启AOF模式之后,每当输入一个写入的操作指令,这个命令首先会被append到AOF缓存区,然后根据fsync规则同步追加到AOF文件末尾。这样在重启redis时候,就会通过读取和执行AOF中的指令恢复数据

 BgRewriteaof AOF重写机制

       因为AOF是一个不断追加的过程,当长时间持久化之后,AOF文件会越来越庞大,为了尽可能的减小AOF文件,Redis提供的AOF的重写机制,主要是用来重写AOF文件中的指令,做精化处理,比如incr了k1 10次,其实就等于是set k1  10 ,所以重写之后就AOF就成了set k1 10。
      因为Redis是单线程处理数据的,所以为了重写过程中不打断客户端操作的情况下,Redis提供了gbrewriteaof命令进行重写操作,它和RDB原理类似巧妙了利用了写时复制机制,通过fork的方式创建子进程完成重写工作主要重写方式有多种

1、直接读取内存中的数据,生成最小指令,

2、读取原AOF配置,进行语义分析重写,大致原理如下:

 AOF优点:

1、AOF数据是非常耐久的,它默认每秒一次的频率同步,即使在宕机的情况下,最多也只会丢失一秒的数据。
2、AOF数据因为宕机等问题损坏后,可以通过redis-check-aof工具进行修复。
3、AOF支持指令重写功能,因为利用了写时复制机制,不会影响主进程的正常使用,即使宕机情况下,原AOF数据也不会丢失。
4、AOF文件时redis文本协议格式存储的,可读性强,可以通过修改AOF文件完成某些场景下一些版本恢复。

RDB-AOF混合

因为RDB会产生数据丢失,但是它文件小,恢复速度快,而AOF文件文件大,但是数据不容易丢失。Redis为了更好的利用各自优点,在Redis4.0版本时,支持RDB-AOF混合持久化模式,其实也是对AOF的增强

补充:Redis在启动的时候,同时开启了AOF和RDB时,会优先加载AOF文件,如果AOF不存在,则取加载RDB。

混合模式也是在重写时触发的,不同的是重写是子线程会优先将内存中的数据按照RDB的形式写入到AOF的头部,以Redis头标识,后面新增的写入操作,一样的流程append到AOF文件的尾部。这样一来,AOF整体的文件就会变得很小,同时数据也同样很耐久。

原图地址:

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

全志F1C200S嵌入式驱动开发(sd卡驱动)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 说是sd卡,其实是micro sd卡,或者称之为tf卡更合适。一般的soc都支持从tf卡启动,所以用tf卡来学习soc、驱动和linux,对新人来说是比较合适的。前面我们已经用sd卡构建了一个类似…

uniapp:针对与富文本解析的几种方法

第一章、富文本的解析方法 1.1 uniapp自带组件&#xff1a;rich-text <rich-text :nodes"nodes"></rich-text> 1.2 v-html <view v-html"item.content"></view> 1.3 uview组件&#xff1a;u-parse <u-parse :content&quo…

学习babylon.js --- [3] 开启https

babylonjs提供WebVR功能&#xff0c;但是使用这个功能得用https&#xff0c;本文讲述如何使用自签名证书来开启https&#xff0c;基于第二篇文章中搭建的工程。 一 生成自签名证书 首先要安装openssl&#xff0c;这个去网上搜下就行了。安装完之后在终端下输入openssl回车可以…

DeepC 实用教程(三)环境数据

目 录 一、前言二、风谱/风剖三、洋流四、波浪4.1 规则波浪4.2 随机波浪谱 五、方向六、海床属性七、位置7.1 创建位置7.2 规则波时域条件7.3 随机波时域条件7.4 波浪散布图7.4.1 散布图分块7.4.2 时域条件 八、参考文献 一、前言 SESAM &#xff08;Super Element Structure A…

y0usef靶场详解

y0usef靶场详解 靶机感悟&#xff1a;对于这个靶机并没有太多的难点&#xff0c;也没有的别多的绊子&#xff0c;就是猜测下一步是什么&#xff0c;耐心的去思考怎么才能进行到下一步。 靶机下载地址&#xff1a;https://download.vulnhub.com/y0usef/y0usef.ova 这个靶机是…

每天一点Python——day55

#第五十五天Python内置数据结构&#xff1a;列表、字典、元组 本次学另外一种数据结构&#xff1a;集合 集合也是可变类型序列 重点&#xff1a;集合里面没有value&#xff0c;只有键&#xff0c;采用也是哈希函数#如图&#xff1a; #集合与字典的对比字典&#xff1a; 字典{ke…

Java 提供的线程安全集合

一、CopyOnWrite&#xff08;COW算法的容器&#xff09; 最终一致性、写分离思想。 用Volatile修饰&#xff0c;每次直接从内存地址中读取&#xff0c;读取时不加锁。 写时用显式锁整个容器&#xff08;防止其它写线程&#xff09;&#xff0c;然后拷贝一份副本&#xff0c;对…

【NLP】transformers的位置编码

一、背景 本文是“实现的变压器”系列的第二篇。它从头开始引入位置编码。然后,它

【Linux | Shell】结构化命令 - if 语句

目录 一、概述二、if-then 语句三、if-then-else 语句四、if-then-elif 语句五、嵌套 if 语句 一、概述 前面文章介绍了一些Shell脚本的基础知识&#xff0c;也了解了怎样构建一个shell脚本文件&#xff0c;让shell脚本执行一些基础的指令&#xff0c;但都是从上到下依次执行的…

少年侠客【InsCode Stable Diffusion美图活动一期】

少年侠客【InsCode Stable Diffusion美图活动一期】 文章目录 Stable Diffusion 模型在线使用地址第一张图第二张图第三张图第四张图第五张图第六章图 一、InsCode Stable Diffusion 体验1.1 界面很友好1.2 小小体验一下1.3 体验感受 二、如何在InsCode给Stable Diffusion安装L…

车载软件架构 —— 闲聊几句AUTOSAR OS(九)

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无需有人关注你。你必须承认自己的价值,你不能站在他人的角度来反对自己。人生在世,最怕的就是把别人的眼光当成自己生活的唯一标…

Keil中文注释乱码解决

1、打开Keil之后&#xff0c;点击Edit 2、点击Configuration 3、 选择Encording &#xff0c;在下拉列表中 选择Chinese GB2312 保存设置&#xff0c;重启keil。

4-1 Working with images

4-Real-world data representation using tensors How do we take a piece of data, a video, or a line of text, and represent it with a tensor in a way that is appropriate for training a deep learning model? This is what we’ll learn in this chapter. We menti…

Spring Boot环境配置Envirnoment

Srping Boot 中我们使用 EnvironmentAware 注入 Environment 对象后&#xff0c;可以在 Environment 中获得系统参数&#xff0c;命令行采参数&#xff0c;文件配置等信息。 Environment 是如何存储&#xff0c;管理这些值的呢&#xff1f;变量发生冲突怎么办呢&#xff1f;我…

Linux--fork创建子进程,操作系统都做了什么

一句话总结&#xff1a;为该进程创建内核数据结构task_struct、地址空间mm_struct、页表并创建映射关系&#xff0c;一定程度上还要将该进程的代码和数据加载进内存 以下是对上面的解释&#xff1a; 首先&#xff0c;fork创建子进程&#xff0c;是不是操作系统里多了一个进程&…

Android ART虚拟机系列: 虚拟机CheckPoint机制分析

背景 在Android ART虚拟机中&#xff0c;GC的部分流程中会执行stop the world的操作&#xff0c;那么&#xff0c;STW在虚拟机中如何实现呢&#xff1f;本文就深入到ART虚拟机源码中&#xff0c;探寻STW的实现过程。 【本文基于android12源码分析】 CheckPoint机制 ART虚拟机…

SPSS数据文件的合并

数据文件合并的方式分为个案合并和变量合并。 个案合并指在两个数据文件拥有同共同变量时&#xff0c;将其中一个数据文件的个案合并到另一个数据文件中。变量合并指在两个数据文件拥有共同个案时&#xff0c;将其中一个数据文件的变量合并到另一个数据文件相应的个案中。 1…

文心一言 VS 讯飞星火 VS chatgpt (60)-- 算法导论6.4 4题

文心一言 VS 讯飞星火 VS chatgpt &#xff08;60&#xff09;-- 算法导论6.4 4题 四、证明&#xff1a;在最坏情况下&#xff0c;HEAPSORT 的时间复杂度是Ω (nlgn)。 文心一言&#xff1a; 要证明在最坏情况下&#xff0c;HEAPSORT 的时间复杂度是 Ω(n log n)&#xff0c…

Asymmetric Student-Teacher Networks for Industrial Anomaly Detection

用于工业异常检测的不对称学生-教师网络 摘要介绍模型架构总体介绍&#xff1a;教师网络学生网络 实验结论 时间&#xff1a;2022.10.14 期刊&#xff1a;WACV 之前师生网络结构的不足&#xff1a; 具有类似体系结构的学生网络&#xff0c;当输入不属于训练分布的数据时&#…

前端 | (三)表单及HTML4收尾 | 尚硅谷前端html+css零基础教程2023最新

学习来源&#xff1a;尚硅谷前端htmlcss零基础教程&#xff0c;2023最新前端开发html5css3视频 文章目录 &#x1f4da;表单&#x1f407;基本结构&#x1f407;常用表单控件⭐️文本输入框⭐️密码输入框⭐️单选框⭐️复选框⭐️隐藏域⭐️提交按钮⭐️重置按钮⭐️普通按钮⭐…