Redis进阶(一):持久化

news2024/11/20 3:30:22

持久化

        何为持久化?

        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 文本的方式追加到文件后面

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

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

相关文章

PyTorch基础-Tensors属性、Tensor的运算

PyTorch的基本概念 Tensor的基本概念 张量高于标量、向量、矩阵 标量说零维的张量,向量是一维的张量,矩阵是二维的张量 Tensor与机器学习的关系 Tensor的创建 函数功能Tensor(*size)基础构造函数Tensor(data)类似np.arrayones(*size)全1Tensorzeros(…

举个栗子!Tableau 技巧(263):按需突出显示文本表的 N 个行

我们分享过 🌰 :突出显示文本表的行或列,可以突出显示文本表中的某一行或某一列。有数据粉提出新的问题:如果想突出显示多行数据,该如何实现呢? 在 Tableau 中是可以实现的(如上图)&…

代码随想录刷题第23天

今天是二叉树的终章,不知不觉已经刷题23天了,先给自己点个赞😄👍 第一题是修剪二叉搜索树,要注意修剪时被删除节点的子树可能符合要求,因此还需向下遍历。最后用root->left与right接住返回值。 迭代法先…

PHP漏洞查询

CVE - Search CVE List (mitre.org) 美国国家漏洞数据库(需要梯子) NATIONAL VULNERABILITY DATABASE NVD - Search and Statistics (nist.gov) 基本都能查询到,传结果详情页里面会有一些解决方案的连接 PHP的官方网站 PHP :: Bugs :: Se…

大模型实践笔记(1)——GLM-6B实践

目录 在Ubuntu上的配置Git Large File Storage 安装Git LFS: 设置Git LFS: 使用Git LFS: 安装GLM-6B 环境依赖 ChatGLM2-6B介绍 配置GLM 下载代码 构建环境 安装依赖 本地部署 网页UI 很多模型在hugging face上面,…

【Linux】 Linux编译器-gcc/g++使用

💗个人主页💗 ⭐个人专栏——Linux学习⭐ 💫点击关注🤩一起学习C语言💯💫 目录 导读1. Linux编译器-gcc/g使用1.1 引入1.2 初识gcc/g1.3 程序运行的四个阶段1.3.1 预处理1.3.2 编译1.3.3 汇编1.3.4 链接 1.…

【Python】一个简单的小案例:实现批量修改图片格式

1.代码 import os from tkinter import Tk, Button from PIL import Imagedef check_and_create_folders():# 获取当前目录current_directory os.getcwd()# 定义文件夹名称folders_to_check ["JPG", "PNG"]for folder_name in folders_to_check:folder_…

Java/Python/Go不同开发语言基础数据结构和相关操作总结-Map篇

Java/Python/Go不同开发语言基础数据结构和相关操作总结 1. Java1.1 基础操作1.1.1 数据结构和定义方式1.1.2 增加1.1.3 修改1.1.4 查询1.1.5 删除1.1.6 获取总长度1.1.7 按key排序1.1.8 按value排序1.1.9 遍历 1.2 常用其他方法1.2.1 几种数据结构的对比 2. Go2.1基础操作2.1.…

代码随想录算法训练营第二十四天| 77. 组合。

77. 组合 题目链接:组合 题目描述: 给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 解题思路: 本题是经典的回溯法解决的组合问题,回溯问题搞清楚纵向递归横向遍历即…

Redis核心技术与实战【学习笔记】 - 12.Redis删除数据后,为什么内存占用率还是很高?

前言 在使用 Redis 是,经常会遇到一个问题:明明做了数据删除,数据量不大,但是 使用 top 命令查看时,发现 Redis 还是占用了很多内存。 这是因为,当删除数据后,Redis 释放的内存空间会由内存分…

Vivado编译介绍

Vivado编译介绍 合成是将寄存器传输级别(RTL)指定的设计转换为门级表示。AMD Vivado™ 合成是定时驱动的,并针对内存进行优化使用和性能。Vivado合成支持以下的可合成子集: •SystemVerilog:IEEE标准SystemVerilog统…

UniMSE: Towards Unified Multimodal Sentiment Analysis and Emotion Recognition

文章目录 UniMSE:实现统一的多模态情感分析和情绪识别文章信息研究目的研究内容研究方法1.总体架构2.Task Formalization3.Pre-trained Modality Fusion (PMF)4.Inter-modality Contrastive Learning5.总体损失函数6.Decoding Algorithm 结果与讨论代码和数据集符号…

博客网站系统测试报告

一、项目背景 博客网站系统采用前后端分离的方法来实现,同时使用了数据库来存储相关的数据,同时将其部署到云服务器上。前端主要有个页面构成:注册页、登录页、个人博客列表页、博客详情页、编辑博客页、修改博客页以及博客系统主页&#xf…

【项目实践02】【优先级阻塞队列】

文章目录 一、前言二、项目背景三、实现方案四、思路延伸1. 优先级队列1.1 concurrent 包下的 PriorityBlockingQueue1.2 Redisson 的优先级阻塞队列 2. jvisualvm 远程连接3. Jstack 高 CPU 排查 五、参考内容 一、前言 本系列用来记录一些在实际项目中的小东西,并…

【算法分析与设计】交换两个节点

📝个人主页:五敷有你 🔥系列专栏:算法分析与设计 ⛺️稳中求进,晒太阳 题目 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本…

实习日志11

1.文件上传报错 1.1.报错信息Invalid typed array length: -2 1.2.查看源码找出错误 定位到检查代码上传是否成功的代码出错,rDataArr[3] 0x03 var pData new Uint8Array(pDataLen);的pDataLen4 说明rDataArr只有0-3,其他数据都没有上传上来 说明…

DoubleEnsemble:基于样本重加权和特征选择的金融数据分析方法

现代机器学习模型(如深度神经网络和梯度提升决策树)由于其提取复杂非线性模式的优越能力,在金融市场预测中越来越受欢迎。然而,由于金融数据集的信噪比非常低,并且是非平稳的,复杂的模型往往很容易过拟合。…

leetcode189.轮转数组|超简单易于理解方法

题目 https://leetcode.cn/problems/rotate-array/description/https://leetcode.cn/problems/rotate-array/description/ 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输…

基于uniapp+vue酒店宾馆客房民宿管理系统设计 微信小程序_54ybz

APP性能需求 (1)顾客在安卓APP页面各种操作可及时得到反馈。 (2)该平台是提供给多个用户使用的平台,用户使用之前需要注册登录。登录验证后,用户才可进行各种操作[10]。 (3)管理员、…

Java 集合 04 综合练习-查找用户是否存在

练习、 代码: public class User{private String id;private String username;private int password;public User() {}public User(String id, String username, int password) {this.id id;this.username username;this.password password;}public String getI…