Redis的持久化-RDB

1.持久化

一提到持久化,我们就会第一时间联想到M有SQL的事务,MySQL事务有四个比较核心的特征:原子性(把多个操作打包成一个整体),一致性(事务执行之前和之后,数据都不能离谱),持久性(事务中做出的修改都会保存在硬盘上)隔离性(事务并发执行,涉及一系列的问题)

Redis是一个内存数据库,数据存储在内存中,内存中的数据是不持久化的,要想做到持久化,就需要让Redis把数据存储到硬盘上。Redis决定内存中存储数据(快!),硬盘中也存数据(持久化)。当要插入到一个新的数据时,就需要把这个数据写入到内存和硬盘上,当查询这个数据的时候,直接从内存中读取,硬盘中的数据知识在Redis重启的时候,用来恢复内存中的数据,但代价是消耗更多的空间,毕竟一份数据存两遍。

持久化可以简单理解为数据存储硬盘上,Redis支持RDB和AOF两种持久化机制,持久化功能有效地避免因进程退出造成数据丢失的问题,当下次重启时候利用之前持久化生成的文件即可实现数据的恢复。

2.RDB

RDB持久化就是把当前进程中的数据生成快照保存到硬盘的过程,触发RDB持久化过程分为手动触发和自动触发,Redis会定期给内存中当前存储这些数据,拍成一个快照,生成一个文件存储在硬盘中,后续Redis一旦重启,内存数据就没了,可以根据快照文件把内存中的数据恢复回来。

2.1触发机制

2.1.1手动触发

程序员通过Redis客户端,执行特殊的命令,来触发生成快照。手动触发分别对应的save和bgsave命令:

save命令:阻塞当前Redis服务器,直到RDB过程完成为止,对于内存比较大的实例造成长时间阻塞,基本不采用。

bgsave命令:Redis进程执行fork操作创建子进程,RDB持久化过程由子进程负责(不会影响Redis服务器处理其他客户端的请求和命令),完成后自动结束。阻塞只发生在fork阶段,一般时间很短。Redis内存所有设计RDB的操作都采用类似的bgsave的方式。

2.1.2自动触发

除了自动触发外,Redis运行自动触发(Redis配置文件中)RDB持久化,这个触发机制才是比较有价值的

1.使用save配置,如save m n 表示m秒内数据集发生n次修改,自动触发RDB持久化

2.从节点进行全量复制的时候,主节点自动进行RDB持久化,随后将RDB文件发送给从节点

3.执行shutdown命令关闭Redis时,执行RDB持久化。

2.2流程说明

bgsave是主流的RDB持久化方式

 bgsave命令的运行流程:

1.执行bgsave,判断当前是否已经存在其他正在工作的子进程,如果有其他进程正在bgsave,此时就直接把当前的bgsave返回

2.如果没有其他子进程,就通过fork这个样的系统调度一个子进程来,fork过程中会阻塞,可以通过info status 命令查看lastest_fork_usec选项,可以获取最近一次fork操作的耗时,单位为微秒。

3.父进程完成fork后,bgsave命令返回Background saving started信息并不再阻塞父进程,生成快照的过程中父进程继续接受客户端的请求,继续提供服务。

4.子进程创建RDB文件,根据父进程内存生产临时快照文件,完成后对原有文件进行原有文件进行原子替换。执行lastsave命令可以获取最后一次生成RDB的时间,对应info统计rdb_last_save_time选项

5.子进程发送信号给父进程表示完成,父进程更新统计信息。

fork是linux系统提供的一个创建子进程的api(系统调用),fork创建子进程简单粗暴,直接把当前(父进程)复制一份,作为子进程。一旦复制完成,父子进程就是两个独立的进程,格子执行各自的任务。

fork复制的过程中,会复制pcb,虚拟地址空间(内存中的数据),文件描述符表。本来Redis Server中若干变量保存了一些键值对,随着这样的fork进行,子进程的这个内存空间也会存在和父进程中一摸一样的数据。接下来安排子进程去执行持久化操作,也就相当于父进程本地这里的内存数据给持久化了。父进程打开一个文件,fork之后,子进程同样可以使用该文件,也就导致了子进程持久化写入的那个文件和父进程本来要写的文件是同一个。

这个时候就会有人问了,如果当前Redis服务器中存储的数据特别多,内存消耗特别大,进行上述复制操作,是否有很大的性能开销?

此处的性能开销其实挺小的。fork在进行内存拷贝时,不是简单无脑将所有元素复制一份,而是通过写时拷贝的机制完成的。如果父进程和子进程的内存数据完全相同,此时不会触发真正的拷贝动作(父子使用一份内存),但是这两个进程的内存空间应该是各自独立完成的。一旦某一个进程对内存数据做了修改,就会触发真正的物理内存上的数据拷贝。在进行bgsave这个场景中绝大部分的内存是不需要修改的,因此子进程的写时拷贝并不会触发很多次,也保证了整体拷贝的时间时可控的,高效的。

2.3RDB文件的处理

2.3.1保存

保存:RDB文件保存在dir配置的指定目录(默认/var/lib/redis/)下,文件名通过dbfilename配置(默认dump.rdb)指定。可以通过执行config  set  dir {newDir} 和 config  set  dbfilename {newFilename}运行期间动态执行,当下次运行的RDB文件会保存到新的目录。当生成的RDB镜像操作的时候,此时就会生成快照数据,先保存在一个临时的文件中,当快照生成完毕之后,再删除之前的rdb文件,把新生成的临时rdb文件改为dump.rdb。自始至终,rdb文件始终有一个

2.3.2 压缩

压缩:Redis默认采用LZF算法对生成的RDB文件做压缩处理,压缩处理后的文件远远小于呢哦村大小,默认开启,可以通过参数config  set  rdbcompression  {yes | no} 动态修改。虽然压缩 RDB文件会消耗CPU,但可以大幅度减低文件的体积,方便保存到硬盘或通过网络发送到从节点,因此建议开启。

2.3.3 校验

校验:如果Redis启动时加载到损坏的RDB文件会拒绝启动,这是可以使用Redis 提供的redis-check-dump工具检测RDB文件并获取对应的错误报告

其实是一个符号链接,在启动redis的时候就是进行检查rdb文件的完整性

 2.4 RDB文件优缺点

优点:

RDB是紧凑压缩的二进制文件,代表Redis在某个时间点上生成的数据快照。非常适用于备份,全量复制等场景,把RDB文件复制到远程机器或者是文件系统中用于灾备。Redis加载RDB恢复数据非常快(二进制)

缺点:

RDB方式持久化数据无法做到实时持久化/秒级持久化。因为bgsave每次运行都要执行fork创建子进程,俗语重量级操作,频繁执行成本高。RDB文件使用特定的二进制格式保存。Redis版本严谨过程中有多个RDB版本,兼容性可能有风险。

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

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

相关文章

前端内存泄漏

个人简介 👀个人主页: 前端杂货铺 🙋‍♂️学习方向: 主攻前端方向,正逐渐往全干发展 📃个人状态: 研发工程师,现效力于中国工业软件事业 🚀人生格言: 积跬步…

部署zabbox企业级分布式监控

目录 一、监控系统的基础认知 2.1 监控的定义与核心价值 2.2 监控的五大类型与五层逻辑架构 (1)五大监控类型 (2)五层逻辑架构 2.3 主流开源监控产品对比 二、Zabbix 系统深度解析 3.1 Zabbix 的定位与发展历程 3.2 Zabb…

时空数据可视化新范式:基于Three.js的生产全流程时间轴回溯技术解析

内容摘要在现代工业生产中,如何高效地管理和分析生产全流程数据是一个关键问题。传统的数据可视化方法往往只能展示静态的数据快照,难以捕捉和回溯生产过程中的动态变化。然而,基于 Three.js 的时间轴回溯技术为这一难题提供了一种全新的解决…

宝塔面板Nginx报错: IP+端口可以直接从访问,反向代理之后就504了 Gateway Time-out

原因表示代理服务器在等待上游服务器&#xff08;即后端服务&#xff09;响应时超时 &#xff1a;<html><head><title>504 Gateway Time-out</title> </head><body><center><h1>504 Gateway Time-out</h1></center&g…

【ComfyUI学习笔记01】下载安装 | 运行第一个工作流 | 学习思路

【ComfyUI学习笔记01】下载安装 | 运行第一个工作流 | 学习思路前言下载安装ComfyUI的下载和安装ComfyUI Manager 的下载和安装运行第一个工作流初识节点 (Nodes) 工作流案例1 Image Generation绘制流程图&#xff0c;确定关键节点放置关键节点&#xff0c;确定连接顺序补充中间…

numpy库的基础知识

一.numpy是什么 &#xff1f;Numpy 是 Python 中专门用于高性能数值计算的库&#xff0c;其核心是一个功能强大的 n 维数组对象&#xff08;ndarray&#xff09;&#xff0c;可以用来存储和操作大规模的数字矩阵或张量数据。numpy库的作用&#xff1a;核心功能&#xff1a;实现…

在UniApp中防止页面上下拖动的方法

1、pages.json中在某个页面设置禁用弹性滚动的页面 {"path": "pages/yourPage/yourPage","style": {"app-plus": {"bounce": "none"}} } 2、 pages.json中在所有页面设置禁用弹性滚动的页面 {"globalStyl…

LinkedList的模拟实现(双向链表Java)

一&#xff1a;结构LinkedList的底层是双向链表结构(链表后面介绍)&#xff0c;由于链表没有将元素存储在连续的空间中&#xff0c;元素存储在单独的节点中&#xff0c;然后通过引用将节点连接起来了&#xff0c;因此在在任意位置插入或者删除元素时&#xff0c;不需要搬移元素…

Shopify 知识点

&#x1f4dc; 一、Liquid模板语言&#xff08;核心基础&#xff09;语法结构 • 输出变量&#xff1a;{{ product.title }} 动态显示商品标题。 • 逻辑控制&#xff1a;{% if product.available %}…{% endif %} 条件渲染。 • 循环遍历&#xff1a;{% for item in collectio…

Web LLM 安全剖析:以间接提示注入为核心的攻击案例与防御体系

文章目录1 间接提示注入2 训练数据中毒为什么会出现这种漏洞&#xff1f;3 泄露敏感训练数据攻击者如何通过提示注入获取敏感数据&#xff1f;为什么会出现这种泄露&#xff1f;4 漏洞案例间接提示注入利用 LLM 中的不安全输出处理5 防御 LLM 攻击把LLM能访问的API当成“公开接…

ElasticSearch:不停机更新索引类型(未验证)

文章目录**一、前期准备****1. 集群健康检查****2. 备份数据****3. 监控系统准备****二、创建新索引并配置****1. 设计新索引映射****2. 创建读写别名****三、全量数据迁移****1. 执行初始 Reindex****2. 监控 Reindex 进度****四、增量数据同步****1. 方案选择****五、双写切换…

python学智能算法(二十七)|SVM-拉格朗日函数求解上

【1】引言 前序学习进程中&#xff0c;我们已经掌握了支持向量机算法中&#xff0c;为寻找最佳分割超平面&#xff0c;如何用向量表达超平面方程&#xff0c;如何为超平面方程建立拉格朗日函数。 本篇文章的学习目标是&#xff1a;求解SVM拉格朗日函数。 【2】求解方法 【2.…

mac安装node的步骤

适用于macOS 10.15及以上版本。 前提条件 macOS版本&#xff1a;确保系统为macOS 10.15&#xff08;Catalina&#xff09;或更高版本。可在“苹果菜单 > 关于本机”查看。管理员权限&#xff1a;部分安装可能需要管理员权限。网络连接&#xff1a;需要联网下载安装包或工具…

【LeetCode数据结构】栈的应用——有效的括号问题详解

&#x1f525;个人主页&#xff1a;艾莉丝努力练剑 ❄专栏传送门&#xff1a;《C语言》、《数据结构与算法》、C语言刷题12天IO强训、LeetCode代码强化刷题 &#x1f349;学习方向&#xff1a;C/C方向 ⭐️人生格言&#xff1a;为天地立心&#xff0c;为生民立命&#xff0c;为…

多尺度卷积模型:Inception块

在GoogLeNet中&#xff0c;基本的卷积块被称为Inception块&#xff08;Inception block&#xff09;。 使用窗口大小为11&#xff0c;33&#xff0c;551\times1&#xff0c;3\times3&#xff0c;5\times511&#xff0c;33&#xff0c;55的卷积层&#xff0c;从不同空间大小中提…

Android 默认图库播放视频没有自动循环功能,如何添加

Android 默认图库播放视频没有自动循环功能, 如何添加 按如下方式添加 开发云 - 一站式云服务平台 .../apps/Gallery2/res/values-zh-rCN/strings.xml | 3 ++ packages/apps/Gallery2/res/values/strings.xml | 3 ++ .../com/android/gallery3d/app/MovieActivity…

7月21日总结

命令执行 RCE RCE&#xff08;remote code execute&#xff09;&#xff1a;远程命令执行或者代码执行&#xff0c;我们平时说的rce&#xff0c;比如thinkPHP的 rce漏洞&#xff0c;即算代码注入漏洞&#xff0c;也算rce漏洞&#xff0c;因为渗透的最终情况可以实现执行命令或…

Linux——自制shell命令行解释器

文章目录1.打印命令提示符2.获取用户输入指令3.重定向分析4.命令行参数表,环境变量表,初始化5.命令解析6.命令执行6.1.创建子进程6.2 处理内建命令6.3 文件重定向7.源码前言 在实现shell的时候我们先创建自己myshell目录&#xff0c;在目录中创建myshell.cc文件&#xff0c;因…

Boost库智能指针boost::shared_ptr详解和常用场景使用错误示例以及解决方法

1、Boost智能指针 —— boost::shared_ptr 详解一、什么是 boost::shared_ptr boost::shared_ptr 是 Boost 库中实现的一个智能指针模板类&#xff0c;用于管理动态分配的对象生命周期&#xff0c;采用引用计数机制。多个 shared_ptr 实例可以共享同一个对象的所有权&#xff0…

科学分析指南,如何快速找到并清理磁盘的无用文件

随着时间的推移&#xff0c;系统中会积累大量的临时文件、缓存文件、不再需要的安装包或其他大型文件。磁盘清理可以删除这些不必要的文件&#xff0c;从而释放宝贵的磁盘空间。它无需安装&#xff0c;插上 U 盘就能直接使用。只需勾选需要扫描的磁盘&#xff0c;点击“开始分析…