【Redis 高级】- 持久化 - RDB

news2024/11/15 11:03:35

【Redis 高级】- 持久化 - RDB

👑什么是持久化呢?

  • 那当然是够持久呀,这个持久如果在你不主动去删除的情况下,它就一直存在的。

🎷那么这有什么用呢?

  • 举个栗子:我们在用 PowerPoint 在写价值 2 个亿的 PPT ,要求明天一大早就要去展示,今天加班到凌晨都必须搞出来,表面很开心,内心在奔腾的你接受了这个,老板的强行建议。

    加班到了凌晨 2 点终于搞完了,正准备休息一会,突然不小心把电源线一脚踢掉了,你颤抖的手点击了一下电源开机键,当屏幕的 win 界面加载出来后,整个人到傻了。桌面干净的只剩下了桌面,这个时候你的内心已经完全奔溃了,想着自己当时,如果保存到文件夹中,就不会出现这样的问题了。一时间你受不了自己的这种行为,自己扇了自己一巴掌,哎!不疼~,原来是在做梦呀。

    赶紧从梦里醒来,才发现原来自己的已经把文件,保存到了文件夹了呀。

通过上面的例子,可以看到 Ctrl+S 的重要性了吧,其实哈,对于我们的 Redis 也是可以进行 Ctrl+S 的,只是方式有些许的不同而已。但目的都是一样 ,PPT 进行保存,是将内存中的数据保存到磁盘中,而对于 Redis 而言,也是将内存中的数据保存到磁盘中。

这就是所谓的持久化,其实目的就是为了提高数据的抗风险能力。

🎸Redis 的持久化都是怎么进行处理的呢?-

  • 哎,对于一个数据要将其中内存保存到磁盘中,首先能想到的是那种方式呢?

    当然是最简单粗暴的,直接将数据的本身进行保存呀,就相当于从内存中复制一份一模一样的数据,直接写到磁盘中呀。

    是呢,确实是这样,我们的 Redis 中的一种持久化的策略中,就用到了上述所猜想的一种理念,直接暴力的保存数据即可。

    这种方式有个名字叫做 RDB(保存的是数据),有点原汁原味的感觉赖

  • emmm,那有没有其他的什么方式呢?

    哎,这个还真有,我们每一次操作的时候,是不是后台都会生成一个操作的记录结果呀,对咯,这个操作的记录结果其实就是我们常常说的 日志 ,既然我们的日志中记录了,我们每一次的操作的过程,那我们可不可以想办法,在 Redis 启动的时候,将日志中的所有的操作都读取出来,然后将所有的指令都执行一遍,这样就可以保证,我们的所有的数据都会刷新到我们的内存中呢?

    是的没错,这样的方式其实就是 AOF (保存的操作的过程)

RDB 的启动方式:

  • save 手动执行一次保存

RDB 启动方式 – save 指令的相关配置

  • 设置本地数据库的文件名,默认为 dump.rdb ,通常设置为 dump-端口号.rdb

dbfilename filename

  • 设置存储 .rdb 文件路径,通常设置为存储空间较大的目录,目录名为 data

    dir path

  • 设置存储至本地数据库时是否数据压缩,默认为 yes ,设置为 no ,节省 CPU 的运行时间,但存储文件变大

    rdbcomperession yes|no

  • 设置读写文件过程中是否进行 RDB 格式校验,默认 yes ,设置为 no,节约读写 10% 时间消耗,单存存在数据损坏的风险

    rdbchecksum yes|no

    bind 192.168.10.101
    port 6379
    logfile "6379.log"
    dir /redis/data
    dbfilename "dump-6379.rdb"
    

    在每一次执行完毕所有的命名之后,执行 save 指令,就会自动的将数据压缩,存储到 dir 指定的目录下,在每一次的开机之后,会自动的加载数据到 Redis 当中。

RDB启动方式 – save 执行的工作原理

  • image-20230219163959461

    在上面的我们可以看到,当我们执行 save 指令后,Redis 有一个数据压缩并保存的时间。

    image-20230219164510029

    有与 Redis 是一个单线程的数据库,所以当我们执行 save 指令的时候,如果说此时我们的数量量是比较大的,那么在执行任务的队列中就会出现阻塞的状态,导致后的获取数据的 get 执行,一直处于等待,知道 save 指令执行完毕。

🏹 那么对于如果数据库过大,单线程执行的而效率会变低那么有没有解决的办法呢?

  • 手动启动后台保存操作,但不是立即执行

    bgsave

RDB启动方式 – bgsave 指令的相关配置

  • 后台存储过程当中如果出现错误现象,是否停止保存操作,默认 yes

    stop-writes-on-bgsave-error yes|no

  • 其他

    dbfilename filename

    dir path

    rdbcopression yes

    rdbchecksum yes|no

    image-20230219165418964

    image-20230219165456020

    bgseve 的执行原理,其实就是后台开启了一个子线程,而子线程负责对我们的文件进行生成,然后将保存成功的消息,返回给我们的主进程并展示。

RDB启动方式 – 自动持久化

  • 设置自动持久化的条件,满足限定时间范围内 key 变化的次数,当达到指定时进行持久化

save second changes

  • 参数

second: 监控的时间范围

changes: 监控时间范围内 key 的变化量

  • 示例

save 900 1

save 300 10

save 60 10000

自动持久化的原理

image-20230219170320527

image-20230219170336347

在我们执行每一条命令的时候,首先会对执行的命令进行判断,如果说一条命令满足了

1、操作会对数据产生影响 (执行了 del 操作,但执行失败)

2、真正产生了影响 (执行了 del 操作,执行成功)

3、是否进行数据上的对比 (该数据删除没有什么影响,但 set 的操作会有影响)

只有满足了以上三点,那么就会将影响的数量 +1

注意:save 配置要根据实际的业务情况而进行设置,如果你设置的过高,或者过低可能都会造成,业务上性能的影响。

👾 其实对于 save 的自动执行,最终执行的也是 bgsave 的操作,只是将原来的手动,变为了自动。

RDB 三种启动方式的对比

方式save指令bgsave指令
读写同步异步
阻塞客户端指令
额外内存消耗
启动新进程

RDB 优缺点

优点

  • RDB是一个紧凑压缩的二进制文件,存储效率较高
  • RDB内部存储的是redis在某个时间点的数据快照,非常适合用于数据备份,全量复制等场景
  • RDB恢复数据的速度要比AOF快很多
  • 应用:服务器中每X小时执行bgsave备份,并将RDB文件拷贝到远程机器中,用于灾难恢复。

缺点

  • RDB方式无论是执行指令还是利用配置,无法做到实时持久化,具有较大的可能性丢失数据
  • bgsave指令每次运行要执行fork操作创建子进程,要牺牲掉一些性能
  • Redis的众多版本中未进行RDB文件格式的版本统一,有可能出现各版本服务之间数据格式无法兼容现象

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

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

相关文章

WEB系列(二)-----------XSS

XSS原理及基础 定义 恶意攻击者会往Web页面里插入JS代码,当用户点击网页时.镶嵌的JS代码就会执行,从而达到恶意的特殊目的. 原因 程序对输入和输出的控制不够严格,导致payload输出到前段时被浏览器当做有效代码执行从而产生危害。 分类 存储型反射型DOM型 测…

常见排序算法--Java实现

常见排序算法--Java实现插入排序直接插入排序折半插入排序希尔排序交换排序冒泡排序快速排序选择排序直接选择排序堆排序归并排序基数排序各种排序方法比较在网上找了些排序算法的资料。此篇笔记本人总结比较,简单注释,觉得比较好理解,且相对…

四大步骤,教你彻底关闭Win10自动更新

文章目录一、禁用Windows Update服务二、在组策略里关闭Win10自动更新相关服务三、禁用任务计划里边的Win10自动更新四、在注册表中关闭Win10自动更新参考资料一、禁用Windows Update服务 1、同时按下键盘 Win R,打开运行对话框,然后输入命令 services…

C语言运算符优先级和结合性一览表

所谓优先级就是当一个表达式中有多个运算符时,先计算谁,后计算谁。 运算符的优先级从高到低大致是:单目运算符、算术运算符、关系运算符、逻辑运算符、条件运算符、赋值运算符()和逗号运算符 简单记就是:! > 算术运…

一起学 pixijs(1):常见图形的绘制

大家好,我是前端西瓜哥。 pixijs 是一个强大的 Web Canvas 2D 库,以其强大性能而著称。其底层使用了 WebGL 实现了硬件加速,当然如果不支持的话,也能回退为 Canvas。 本文使用的 pixijs 版本为 7.1.2。 Application Applicati…

【LeetCode】剑指 Offer 08. 二叉树的下一个节点 p65 -- Java Version

题目链接:无题目链接,不知道为啥力扣上找不到这一题。 1. 题目介绍(08. 二叉树的下一个节点) 题目:给定一个二叉树和其中的一个节点,请找出中序遍历顺序的下一个节点并且返回。注意,树中的节点…

linux线程阻塞中CPU的占用率

linux线程阻塞中CPU的占用率 一、简介 总所周知Linux系统下,我们编写的程序进入阻塞后,系统把任务挂起,交给内核进行处理,此时我们的进程CPU占用率不高,可以说是占用率0.0%,让CPU资源交给其他进程处理&am…

【算法】三道算法题目单词拆分,填充每个节点的下一个右侧节点指针以及组合总和

算法第一道算法题:单词拆分java解答参考第二道算法题:填充每个节点的下一个右侧节点指针java 解答参考第三道算法题:组合总和java解答参考大家好,我是小冷。 今天还是继续学习算法技术知识吧 第一道算法题:单词拆分 …

Docker - 镜像操作命令

镜像名称一般分为两部分组成:[repository]:[tag]在没有指定tag时,默认是latest,代表最新版本的镜像1.下载docker镜像 docker pull repository:tag2.查看本地所有镜像 docker images3.创建镜像别名 docker tag repository:tag repository111:tag4.查看镜像…

java面试题-集合篇

Collection1.Collection有哪些类?Java集合框架中的Collection接口是所有集合类的基础接口,定义了一些基本的集合操作,如添加元素、删除元素、判断是否包含某个元素等。常见的集合类包括List、Set和Queue。ListList接口定义了按照索引访问和操…

Module理解及使用

ES6的模块化设计思想是静态化,也就是说,在编译的时候确定模块的依赖关系,以及输出输出入的变量。而CommonJS和AMD模块都是在运行时确定的。ES6的模块不是对象,而是通过export显示指定输出的代码,再通过import命令输入。…

ES6新特性详解

文章目录1. let和const1.1 let声明变量1.2 const声明常量2. 模板字符串3. 解构赋值3.1 数组的解构赋值3.2 对象的解构赋值4. 函数扩展4.1 参数默认值4.2 剩余参数4.3 箭头函数5. 对象扩展5.1 对象简写5.2 属性名表达式5.3 扩展运算符6. Symbol7. Iterator和Generator7.1 Iterat…

k8s自动化安装脚本(kubeadm-1.23.7)

文章目录介绍软件架构版本介绍更新内容2023-02-192023-02-152023-02-142023-02-102022-10-202022-08-06准备部署包操作步骤环境准备结构备注解压部署包修改host文件脚本使用方式初始化环境验证ansible配置安装k8s集群登录master的节点添加node节点master节点状态检查组件安装安…

高精度算法一

目录 1. 基础知识 2. 大整数 大整数 3. 大整数 - 大整数 1. 基础知识 利用计算机进行数值计算,有时会遇到这样的问题:有些计算要求精度高,希望计算的数的位数可达几十位甚至几百位,虽然计算机的计算精度也算较高了&#xff0c…

大数据之---Nifi-处理器类别_详细了解各种处理器的含义用途---大数据之Nifi工作笔记0007

处理器有很多类这里主要分了,数据转换的可以看到上面的这些是数据转换常用的 然后: 这里这个controlrate,用来控制流的速率,来保护作用,防止崩掉 distributeLoad用来负载均衡,减轻压力 这里的路由是,根据是否满足对应的条件,来执行是否把数据路由到某个地方. 然后来看数据库…

数据库技术-函数依赖、键与约束、范式

一、函数依赖 给定一个x,能唯一确定一个Y,就称x确定Y,或者说Y依赖于x,例如YX*X函数。 函数依赖又可扩展以下两种规则: 部分函数依赖:A可确定C,(A,B)也可确定C,(A,B)中的一部分(即A)可以确定C&a…

Spring Cloud Nacos实战(一)- 下载和安装

Spring Cloud Alibaba Nacos下载和安装 Nacos介绍 ​ Nacos(Naming Configuration Service) 是一个易于使用的动态服务发现、配置和服务管理平台,用于构建云原生应用程序 ​ 服务发现是微服务架构中的关键组件之一。Nacos 致力于帮助您发现…

使用nginx单独部署Vben应用

前言 本文主要介绍Vben使用nginx单独部署的方式,其实前端发展到现在已经不是当年的jsp,asp必须要和后端一起部署了。单独部署调试的工具也很多,比如vue-cli-service 和 Vben中用到的vite ,当然这些我们一般用在开发的工程中。正式…

SpringCloud(三)Hystrix断路器服务降级、服务熔断、服务监控案例详解

七、Hystrix断路器 7.1 简介 分布式系统面临的问题 复杂分布式体系结构中的应用程序有数十个依赖关系,每个依赖关系在某些时候将不可避免地失败。 多个微服务之间调用的时候,假设微服务A调用微服务B和微服务C,微服务B和微服务C又调用其它的微…

C# chart绘图 鼠标响应

1、图形自动滚动设置 chart1.ChartAreas[0].AxisX.Maximum 横坐标显示区域最大值 chart1.ChartAreas[0].AxisX.Minimum 横坐标显示区域最小值 显示宽度 chart1.ChartAreas[0].AxisX.Maximum - chart1.ChartAreas[0].AxisX.Minimum chart1.ChartAreas[0].AxisX.Maximum x_d…