Redis进阶(一):持久化

持久化

        何为持久化?

        MySQL的事务有四个比较核心的特征:原子性、一致性、持久性和隔离性,这里的持久性和持久化说的是一个事,简单来说,数据存储在硬盘上就是持久,存在内存上那就是不持久(重启之后,这个数据还在就是持久),但是redis是一个内存数据库,在内存中想要实现持久化,就需要redis将数据存储到硬盘上。

        但是redis一大优势就是快,而快的前提是将数据存储到内存上,似乎二者发生了冲突,于是redis决定:插入数据,内存、硬盘都插入数据,取出数据,只从内存读取数据。redis重启,内存恢复数据就是从硬盘中恢复就ok了。

        接下来展示几种具体实现持久化的策略 : RDB和AOF,二者的区别简单来说就是:RDB会定期去更新备份资料,AOF是每次新数据来了,就实时更新备份资料。

        RDB

        RDB会定期的将内存中的数据,存储到硬盘中,并生成一个快照。何为快照?redis给内存中当前存储的这些数据拍个照片,生成一个文件存储到硬盘中,当redis想要恢复内存的时候,就拿着快照,就找硬盘要之前的数据。

        这里说 定期 实际上是有俩个具体操作的 :

        1、手动触发 :程序员在redis客户端通过手动的方式,也就是执行特定的命令来实现快照生成,save和bgsave

        而save的话,当其执行的时候,redis会全力以赴的执行快照拍取,可能会出现堵塞的情况。

        bgsave则是后台运行save,不会影响其他redis命令执行的,这里靠的是多进程实现的。

       bgsave实现流程

        1、判定当前其他进程执行了bgsave命令,有的话直接返回 没必要重复存储

        2、如果没有其他子进程执行的话,就fork创建一个子进程出来

        fork创建子进程是简单且粗暴的,将父进程完全复制出来一份作为子进程,复制PCB、redis server中的键值对数据等也是完全复制到子进程的,因此将子进程这个克隆体进行持久化操作也就是将父进程这个本体进行持久化咯,并且进行内存拷贝的时候,使用的策略是写时拷贝:如果子进程和父进程数据完全一样,不会真正的去拷贝数据(父子其实用的是一份内存数据),而当某一方想要修改数据的时候(执行写操作),二者的内存空间才会发生真正的复制拷贝,真正的划分了。

        3、子进程负责写文件生成快照,父进程继续接收客户端请求 继续提供服务。

        4、子进程完成持久化之后,会通知父进程,父进程会更新一些统计信息,子进程就可以结束销毁了。

        RDB文件

        RDB文件是存放在redis工作目录中的,rdb机制生成镜像文件,这个文件是二进制的形式(压缩后)出现的。

        rdb是可以触发多次的:当生成RDB镜像操作的时候,先把这个要生成的快照数据存放到一个临时的文件中,当这个快照文件生成完毕替换之前的rdb文件。确保rbd文件始终只有一个

        

手动执行生成快照之后(实现了持久化)查看rdb文件会发生变化:

2、自动触发:在redis配置文件中,每隔一段时间或者每添加了多少次数据之后进行生成快照。

        

如果是通过正常流程重新启动 redis 服务器,此时 redis 服务器会在退出的时候,自动触发生成 rdb 操作但是如果是异常重启(kill -9 或者 服务器掉电)此时 redis 服务器来不及生成 rdb,内存中尚未保存到快照中的数据,就会随着重启而丢失

通过修改配置文件也可以实现自动生成快照


bgsave操作流程是创建子进程,子进程完成持久化操作。持久化操作会把数据写入新的文件中,然后用新的文件去替换旧的文件。

RDB特点小结

        RDB是一个紧凑压缩型二进制文件,它代表某个时间点的数据快照,由于它是全量复制,因此其复制成本较高,属于重量级操作,可以周期性执行bgsave。

        恢复数据快于AOF(二进制)。

        RDB有多个版本,版本兼容 性不好。


        通过以上对RDB的学习,我们可以观察到RDB的一个漏洞,会在俩次快照之间,实时数据可能会随着重启而丢失,因此AOF将发挥作用

AOF:append only file

        类似于mysql的binlog,将用户每一步操作,都记录下来到文件中。每次redis重新启动的时候,就读取aof文件,而且当aof开启的时候,redis不再读取rdb文件。

        既然会实现记录操作,会影响redis性能吗?

        1、AOF机制并非是直接将数据写入硬盘,而是写入一个内存中的缓存区,积累一定大小之后,再写入硬盘。

        2、硬盘读写是顺序写入,每次把新的操作写到原有文件的末尾。

缓冲区刷新策略  

重写机制

         AOF文件持续增大,会影响到下次redis启动的时间。

AOF会有冗余数据:

        因此redis存在一个机制,针对aof文件进行整理,用于剔除冗余操作,合并一些操作,达到aof瘦身效果。

       

重写流程

        父进程fork一个子进程,父进程仍然接受请求,子进程负责针对aof进行重写,要注意的是,重写的时候,不关系aof文件原来有啥,而是现在内存中最终的数据状态(内存中的数据状态就是将aof文件结果整理之后的了),直接将内存中的最终数据写到新的aof文件即可,这里有点像rdb文件,只不过aof是文本形式生成的。

        父进程也不闲着,因为可能会有新的请求想要写入,因此父进程会把这些新的请求写入到缓冲区中,再刷新到原来的aof文件,但是子进程只是继承了fork之前的父进程,对于新的请求是没有办法感知的,因此父进程对于新的请求写入到缓冲区还有一个新的缓冲区选哟写入,那就是aof_rewrite_buf,专门存放fork之后的数据,然后子进程把自己的数据写完在新的aof文件之后,再用 信号 通知父进程 将aof_rewrite_buf里面的数据写到新 的aof文件中,最后就可以用新的aof文件去替换旧 的aof文件了。

如果,在执行 bgrewriteaof 的时候,当前 redis 已经正在进行 aof 重写了,会咋样呢?
此时,不会再次执行 aof 重写.直接返回了
如果, 在执行 bgrewriteaof 的时候, 发现当前 redis 在生成 rdb 文件的快照, 会咋样呢?
此时, aof 重写操作就会等待,等待 rdb 快照生成完毕之后,再进行执行 aof重写

混合持久化

        AOF 本来是按照文本的方式来写入文件的.但是文本的方式写文件,后续加载的成本是比较高的redis 就引入了"混合持久化" 的方式    结合了 rdb 和 aof 的特点:
        按照 aof 的方式,每一个请求/操作, 都记录入文件,在触发 aof 重写之后,就会把当前内存的状态按照 rdb 的二进制格式写入到新的 aof 文件中后续再进行的操作,仍然是按照 aof 文本的方式追加到文件后面

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

FANUC机器人示教器的菜单变成了图标,如何改成列表的形式?

FANUC机器人示教器的菜单变成了图标,如何改成列表的形式? 如下图所示,开机后按下MENU菜单键时,发现原来的列表形式变成了菜单图标的形式,同时在按F1-F5键时,提示:HMI模式-键不可用, …

Github处理clone慢的解决方案

Github设置代理clone依然慢的解决方案 1、前提:科学上网 注意: 必须要有科学上网!必须要有科学上网!必须要有科学上网!重要的事情说三遍; 2、http/https方案(git clone时使用http&#xff09…

电脑怎么录屏?打造专业级视频内容!

随着科技的进步,电脑已经深入到我们的日常生活和工作中。而在这个数字时代,录制屏幕内容变得日益重要。无论是制作教程、分享游戏技巧,还是记录重要的演示,录屏都是一个不可或缺的功能。可是电脑怎么录屏呢?本文将深入…

LeetCode:138. 随机链表的复制之如何有效copy

自己复制的话,很容易写出来一个时间复杂度O(n ^ 2) 空O(n)的做法 我们可以参考基因的复制, 目录 题目: 实现思路(基因复制式的copy): 官方快慢指针解法&…

跟着cherno手搓游戏引擎【18】抽象Shader、项目小修改

抽象&#xff1a; Shader.h: #pragma once #include <string>namespace YOTO {class Shader {public:virtual~Shader()default;virtual void Bind()const0;virtual void UnBind()const0;static Shader* Create(const std::string& vertexSrc, const std::string&am…

20240202在Ubuntu20.04.6下使用whisper.cpp的CPU模式

20240202在Ubuntu20.04.6下使用whisper.cpp的CPU模式 2024/2/2 14:15 rootrootrootroot-X99-Turbo:~/whisper.cpp$ ./main -l zh -osrt -m models/ggml-medium.bin chs.wav 在纯CPU模式下&#xff0c;使用medium中等模型&#xff0c;7分钟的中文视频需要851829.69 ms&#xf…

算法学习——华为机考题库2(HJ11 - HJ20)

算法学习——华为机考题库2&#xff08;HJ11 - HJ20&#xff09; HJ11 数字颠倒 描述 输入一个整数&#xff0c;将这个整数以字符串的形式逆序输出 程序不考虑负数的情况&#xff0c;若数字含有0&#xff0c;则逆序形式也含有0&#xff0c;如输入为100&#xff0c;则输出为0…

个人网站如何让搜索引擎收录

当我们花费功夫搭建好个人网站&#xff0c;如何能让搜索引擎搜索到个人网站呢&#xff1f;比如百度&#xff0c;根本百度不到自己网站的内容。这时候就要使用到搜索引擎提供的站点收录功能了&#xff0c;但是点开百度的搜索资源平台&#xff0c;添加自己的站点时&#xff0c;就…

帮管客CRM SQL注入漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

地理坐标系、空间坐标系、epsg查询网站

坐标系可用范围和详细信息的查询网站 简介 epsg.ruiduobao.com是一个可以查询gdal中所有坐标系信息的网站&#xff0c;可查询到坐标系的基准面、椭球体、中央子午线等相关信息&#xff0c;并对每个坐标系的可用范围在地图中进行了显示。详细信息可以看操作视频&#xff1a; e…

使用D3.js和React绘制动画条形图

摘要: 将条形图分解为独立组件:容器、坐标轴和条形。使用SVG和D3.js绘制这些组件。使用React的callback ref在DOM中渲染它们。 使用D3绘制图表像搭建乐高 使用D3.js绘制图表时,你处理各种独立组件 —— 很像乐高积木。你单独建造组件,然后将它们组装在一起创建最终图表。这适…

Qt 范例阅读: QStateMachine状态机框架 和 SCXML 引擎简单记录(方便后续有需求能想到这两个东西)

一、QStateMachine 简单应用&#xff1a; 实现按钮的文本切换 QStateMachine machine; //定义状态机&#xff08;头文件定义&#xff09;QState *off new QState(); //添加off 状态off->assignProperty(ui->pushButton_2, "text", "Off"); //绑定该…

MacBook安装软件时允许任何来源的软件

MacBook安装软件时允许任何来源的软件 临时设置允许未知来源的app 当下载网上的软件并安装时,会安装失败, 因为MacOS默认只允许安装App Store上的软件 这时可以临时允许安装,如下设置 开启设置—->安全性与隐私—->未知来源的app 这种方式比较安全 设置允许任何来源…

基于WordPress开发微信小程序2:决定开发一个wordpress主题

上一篇&#xff1a;基于WordPress开发微信小程序1&#xff1a;搭建Wordpress-CSDN博客 很快发现一个问题&#xff0c;如果使用别人的主题模板&#xff0c;多多少少存在麻烦&#xff0c;所以一咬牙&#xff0c;决定自己开发一个主题模板&#xff0c;并且开源在gitee上&#xff…

freertos 源码分析二 list链表源码

list.c 一、链表初始化 void vListInitialise( List_t * const pxList ) { pxList->pxIndex ( ListItem_t * ) &…

LabVIEW核能设施监测

LabVIEW核能设施监测 在核能领域&#xff0c;确保设施运行的安全性和效率至关重要。LabVIEW通过与硬件的紧密集成&#xff0c;为高温气冷堆燃料装卸计数系统以及脉冲堆辐射剂量监测与数据管理系统提供了解决方案。这些系统不仅提高了监测和管理的精确度&#xff0c;也保证了核…

pytorch创建tensor

目录 1. 从numpy创建2. 从list创建3. 创建未初始化tensor4. 设置默认tensor创建类型5. rand/rand_like, randint6. randn生成正态分布随机数7. full8. arange/range9. linspace/logspace10. Ones/zeros/eye11. randperm 1. 从numpy创建 2. 从list创建 3. 创建未初始化tensor T…

Fashion MNIST数据集介绍及基于Pytorch下载数据集

Fashion MNIST数据集介绍及基于Pytorch下载数据集 &#x1f335;文章目录&#x1f335; &#x1f333;引言&#x1f333;&#x1f333;Fashion MNIST数据集简介&#x1f333;Fashion MNIST数据集的类别说明Fashion MNIST数据集图片示例 &#x1f333;基于PyTorch下载Fashion MN…

改进的 K-Means 聚类方法介绍

引言 数据科学的一个中心假设是&#xff0c;紧密度表明相关性。彼此“接近”的数据点是相似的。如果将年龄、头发数量和体重绘制在空间中&#xff0c;很可能许多人会聚集在一起。这就是 k 均值聚类背后的直觉。 我们随机生成 K 个质心&#xff0c;每个簇一个&#xff0c;并将…

ElasticSearch-ElasticSearch实战-仿京东商城搜索(高亮)

注&#xff1a;此为笔者学习狂神说ElasticSearch的实战笔记&#xff0c;其中包含个人的笔记和理解&#xff0c;仅做学习笔记之用&#xff0c;更多详细资讯请出门左拐B站&#xff1a;狂神说!!! 七、ElasticSearch实战 仿京东商城搜索&#xff08;高亮&#xff09; 1、工程创建…