【Redis进阶】RDB持久化策略

1. 浅谈持久化

持久化:能够在重启主机/进程的时候,将数据从硬盘中恢复到内存的特性。
持久化相信大家都是不陌生的,毕竟MySQL中事务ACID四大特性中就包含持续性这样的特点,所谓持久化,本质上就是将数据保存在硬盘上;不持久化就意味着将数据保存在内存中。
Redis的持久化机制:对于Redis而言,将数据保存在内存中是其效率高的重要原因,但是为了保证数据的可靠性,Redis也提供了持久化机制。那么问题来了,Redis的持久化机制会影响到Redis的性能吗?大概率是不会的,因为Redis查询数据的时候仍然是从内存中读取,只是额外将数据多保存了一份在硬盘上,额外内存开销也没有很大,Redis具体提供了RDB、AOF两种机制进行持久化。

2. RDB机制

RDB(Redis DataBase):简单来说,Redis会定期的将内存的全量数据生成一个快照(dump.rdb文件),然后保存在硬盘中。
这个快照就类似于警察到达案发现场后,就会在周围设立警戒线,然后拍照保存现场状态。当Redis遇到特殊情况(断电)进程异常退出后,尽管内存数据丢失,仍旧可以通过这个快照文件进行恢复

2.1 RDB触发时机

RDB的触发时机有两种情况:

  1. 手动触发:即通过客户端命令的方式执行生成快照的过程
    1. save命令:当执行save命令后,redis服务器就会全力以赴的生成这个RDB快照文件,进而阻塞其余redis客户端命令的执行(不推荐×)
    2. bgsave命令:即通过后台方式运行,此处redis服务器会fork出一个子进程,然后由子进程完成生成RDB快照的任务,此时主进程仍然可以处理其余的redis客户端命令
  2. 自动触发:在redis的配置文件(redis.conf)配置经过多长时间 / 经过多少次修改。

关于RDB快照文件的存储位置在redis的配置文件(redis.conf)中有明确定义:
image.png
此处我的云服务器默认dump.rdb文件就生成在./的工作目录下,当我们使用vim dump.rdb查看这个文件
image.png
我们观察该文件的格式,可以发现该RDB文件是一个二进制文件,后续redis重启后,就会尝试该文件,如果格式出现错误,就有可能会出现加载失败!

由于dump.rdb文件非常重要,因此不要随意修改!redis还提供了一些客户端命令例如redis-check-rdb等用于检查rdb文件是否正确

总结:

  • redis默认开启了RDB策略,会自动生成dump.rdb快照文件,该文件路径可以在配置文件redis.conf目录进行配置
  • dump.rdb文件是一个二进制压缩文件
  • 可以通过手动触发/自动触发两种方式来生成RDB镜像文件

2.2 bgsave执行流程

当redis服务器处理bgsave命令就会执行以下流程:

执行流程:

  1. 服务器接收bgsave命令
  2. 服务器主进程就会fork出一个子进程,此时主进程可以继续执行其余客户端命令
  3. 子进程具有和父进程相同的内存数据,就可以依据这些数据生成rdb二进制文件(存放在一个临时文件中),处理完后才会将新的临时文件覆盖原先的rdb文件
  4. 当子进程任务完成之后就会使用信号机制通知父进程

2.3 RDB自动触发策略

由于rdb文件并不是实时更新的,因此我们还需要查看redis.conf配置的触发条件:
image.png
上述配置项就配置了RDB的触发策略:save 经过时间 修改次数,因此上面三项配置就是:

  • 在3600s内修改次数达到1次,就会在3600s(1小时)生成RDB文件
  • 在360s内修改次数达到100次,就会在300s(5分钟)生成RDB文件
  • 在60s内修改次数达到10000次,就会在60s(1分钟)生成RDB文件

事实上我们可以在配置项中任意更改,但需要满足一定条件:生成RDB的频率不能太高,因为生成一次RDB快照需要将内存中的全量数据全部压缩,成本比较大

RDB的缺点:正是因为RDB采用的是每隔一定时间进行RDB快照生成,例如如果配置为save 5 1,那么当前执行过一次RDB策略,但是接下来5min之类有大量请求涌入,就在某一刻,系统断电了,此时RDB文件没有进行更新,导致了数据不一致的情况

2.4 实操

理论大致讲完了,现在我们进行实操验证:
场景一:手动执行save/bgsave生成快照

127.0.0.1:6379> set k1 111
OK
127.0.0.1:6379> set k2 222
OK
127.0.0.1:6379> set k3 333
OK
127.0.0.1:6379> bgsave
Background saving started

image.png
当我们尝试强制杀死redis进程的时候,重启redis服务,观察能否恢复内存数据:

[root@VM-16-5-opencloudos redis]# ps -aux | grep 6379
redis        672  0.1  0.2 136452  5108 ?        Ssl  Jun11   6:39 /www/server/redis/src/redis-server 0.0.0.0:6379
root     2667081  0.0  0.1   6792  2048 pts/0    S+   14:58   0:00 grep --color=auto 6379
[root@VM-16-5-opencloudos redis]# kill -9 672
[root@VM-16-5-opencloudos redis]# systemctl restart redis
[root@VM-16-5-opencloudos redis]# redis-cli
127.0.0.1:6379> keys *
1) "k3"
2) "k1"
3) "k2"

可以看到内存数据已经被恢复到内存中了!
场景二:插入新数据后不执行bgsave命令

127.0.0.1:6379> keys *
1) "k3"
2) "k1"
3) "k2"
127.0.0.1:6379> set k4 444
OK
127.0.0.1:6379> exit
[root@VM-16-5-opencloudos redis]# ps -aux | grep redis
redis    2667513  0.1  0.6 136452 11640 ?        Ssl  14:59   0:01 /www/server/redis/src/redis-server 0.0.0.0:6379
root     2673606  0.0  0.1   6792  2048 pts/0    S+   15:11   0:00 grep --color=auto redis
[root@VM-16-5-opencloudos redis]# kill -9 2667513
[root@VM-16-5-opencloudos redis]# systemctl restart redis
[root@VM-16-5-opencloudos redis]# redis-cli
127.0.0.1:6379> keys *
1) "k3"
2) "k2"
3) "k1"

此时就可以证明redis是根据dump.rdb快照文件恢复数据的,但是其中没有新添加的k4信息,因此不会恢复到内存中

这里需要注意:我们必须要通过kill -9的方式杀死进程,如果使用一些例如systemctl stop redis等命令,redis会在shutdown之前进行生成RDB的过程,如下几种方式都可以生成RDB快照

  1. 执行save/bgsave/自动触发
  2. 进行主从复制
  3. 执行shutdown等命令

场景三:观察执行bgsave文件替换过程
前面我们提到过,当执行bgsave命令时子进程会将数据文件存放到临时文件中,然后再替换原有的RDB文件,我们可以通过Linux文件系统的stat命令查看文件inode编号:

[root@VM-16-5-opencloudos redis]# stat dump.rdb
  File: dump.rdb
  Size: 2151      	Blocks: 8          IO Block: 4096   regular file
Device: 252,1	Inode: 829479      Links: 1
[root@VM-16-5-opencloudos redis]# redis-cli
127.0.0.1:6379> bgsave
Background saving started
127.0.0.1:6379> exit
[root@VM-16-5-opencloudos redis]# stat dump.rdb
  File: dump.rdb
  Size: 2151      	Blocks: 8          IO Block: 4096   regular file
Device: 252,1	Inode: 819717      Links: 1

可以发现dump.rdb文件的编号已经发生了改变

补充:在Linux上常见的文件系统组织方式(ext4)将整个文件系统分为了以下三大部分:

  1. 超级块(存放一些管理信息)
  2. inode区(存放inode节点,每个文件都会被分配一个inode数据结构,存放各种元数据信息)
  3. block区(存放文件的具体数据内容)

场景四:通过配置自动生成RDB
image.png
新增配置项:save 10 1(注意:更改完配置文件后一定要重启redis服务)

127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> set k1 111
OK
127.0.0.1:6379> exit

在10s后重新观察dump.rdb文件就可以发现重新执行了RDB生成过程
场景五:故意改坏RDB文件,观察启动现象
当我们尝试在dump.rdb中间修改一些数据,使用kill -9 强制杀死redis服务,就会出现启动失败的现象,查看日志文件redis.log(在配置文件redis.conf可以配置)
image.png
我们也可以通过一些客户端工具,例如redis-check-rdb检查RDB文件格式:
image.png

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

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

相关文章

Sping源码(九)—— Bean的初始化(非懒加载)— lookupMethod标签

序言 在继续深入Spring的对象创建流程之前&#xff0c;这篇文章先简单介绍一下lookupMethod标签的用法及作用。 准备的xml 自定义名为methodOverride.xml的配置文件。 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.s…

【星海随笔】云解决方案学习日志篇(三) 工作原理篇

Filebeat工作原理 Filebeat 是使用 Golang 实现的轻量型日志采集器,也是 Elasticsearch stack 里面的一员。本质上是一个 agent ,可以安装在各个节点上,根据配置读取对应位置的日志,并上报到相应的地方去。 使用了背压敏感协议,因此不会使管道过载。当Logstash数据处理繁忙时,…

张艺兴step新专开启自由驾驶新纪元

张艺兴《Step》新专&#xff0c;开启自由驾驶新纪元&#xff01;当音乐与驾驶相遇&#xff0c;会碰撞出怎样的火花&#xff1f;当实力派艺人张艺兴遇上全新英文专辑《Step》&#xff0c;便为我们解锁了一种前所未有的出行体验&#xff01;这不仅仅是一张音乐专辑&#xff0c;更…

南方cass专业测绘软件下载,南方cass功能强大的cad辅助测绘软件获取!

在测绘领域&#xff0c;南方CASS测绘软件无疑是一颗璀璨的明星&#xff0c;被誉为“全能选手”。这款软件在功能方面表现出了令人赞叹的多样性和专业性&#xff0c;为测绘工作提供了极大的便利。 ​ 首先&#xff0c;南方CASS测绘软件具备强大的数据兼容性&#xff0c;支持多种…

万相台的功能是什么?如何使用万相台?

1.特点&#xff1a; 万相台是一个智能渠道&#xff0c;可控性弱&#xff0c;高转化&#xff0c;人群&关键词是黑盒&#xff1b; 2.场景多&#xff1a; 有拉新快、活动加速、上新快、货品加速、活动加速、多目标直投、全站推等&#xff1b; 3.扣费逻辑&#xff1a;cpc付…

【WEB前端2024】3D智体编程:乔布斯3D纪念馆-第41课-动态添加3D对象

【WEB前端2024】3D智体编程&#xff1a;乔布斯3D纪念馆-第41课-动态添加3D对象 使用dtns.network德塔世界&#xff08;开源的智体世界引擎&#xff09;&#xff0c;策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtns.network是一款主要由JavaScript编写的智体世界引擎…

填报志愿选大学专业,文科生如何选专业?

读文科的同学接触的专业知识相对广泛&#xff0c;往往被认为是“万金油”&#xff0c;他们仿佛什么都能做&#xff0c;但是和专业技能类知识不同&#xff0c;缺乏技术支持&#xff0c;从而使得文科专业的就业方向和前景远远比不上理科专业那么明朗&#xff0c;对于众多文科生而…

机器学习:回顾总结

学了什么 进阶内容 接下来如何学习 找个项目自己练习多读前沿paper 学员分布

【linux网络(三)】HTTP协议详解

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Linux从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多操作系统知识   &#x1f51d;&#x1f51d; Linux网络 1. 前言2. 序列化和…

使用QT绘制简单的动态数据折线图

两个核心类时QChart和QLineSeries 下面这个示例代码中&#xff0c;定时器每隔一段时间将曲线图中的数据点向右移动 一个单位&#xff0c;同时调整横坐标轴的范围&#xff0c;实现了一次滚动对应移动一个数据点的效果。 QLineSeries最多容纳40961024个点 #include <QtWidg…

boot整合solr

换了新项目组&#xff0c;技术相对老些&#xff0c;于是用boot框架简单记录下&#xff01; 安装 下载路径&#xff1a;https://solr.apache.org/downloads.html Windows环境 下载solr-8.2.0.zip包并解压缩&#xff0c;以管理员身份打开cmd&#xff0c;执行 solr cmd 命令启…

【开源项目】重庆智慧城市案例~实景三维数字孪生城市CIM/BIM

飞渡科技数字孪生重庆管理平台&#xff0c;以实景三维平台为支撑&#xff0c;以城市数据库对接为核心&#xff0c;利用数字孪生技术&#xff0c;结合云计算、物联网IOT等技术&#xff0c;对接城市规划、智能交通、和公共安全等系统。 利用平台强大的国产自研渲染引擎&#xff0…

你的职业规划就是面向贫穷的规划

如果你觉得作者的文章还有点用,请记得点赞 + 关注 说一个扎心的事实,就是我们绝大多数人的职业规划基本上都是错误的,都是面向贫穷的规划。 因为绝大多数人的职业规划都是打工人的职业规划,这种规划除了很少部分人最终能成为企业高管,实现层级跃迁外,绝大多数人在大多数…

AI大模型探索之路-实战篇:智能化IT领域搜索引擎之知乎网站数据获取(初步实践)

系列篇章&#x1f4a5; No.文章1AI大模型探索之路-实战篇&#xff1a;智能化IT领域搜索引擎的构建与初步实践2AI大模型探索之路-实战篇&#xff1a;智能化IT领域搜索引擎之GLM-4大模型技术的实践探索3AI大模型探索之路-实战篇&#xff1a;智能化IT领域搜索引擎之知乎网站数据获…

Spring Boot:Java 应用开发高效之道

Spring Boot 是一种革命性的框架&#xff0c;旨在简化 Java 应用的创建和部署过程。通过自动化配置和简化项目搭建流程&#xff0c;Spring Boot 大大加速了开发周期&#xff0c;让 Java 应用开发变得更加高效和便捷。 核心优势&#xff1a; 快速启动和简化配置&#xff1a;Spr…

wordpress轻量免费主题

WordPress建站公司 适合提供WordPress建站服务的公司或个体(个人)工作室使用的WordPress建站公司主题模板。 https://www.jianzhanpress.com/?p545 首屏大图红色简洁wordpress主题 首屏大图红色简洁wordpress主题&#xff0c;非常地高端大气上档次&#xff0c;可用于多个行…

感受光子芯片中试线,如何点亮未来计算与通信的革命之路(2024青岛智能装备与通信技术展)

光子芯片中试线&#xff1a;点亮未来计算与通信的革命之路 在新一代信息技术的浪潮中&#xff0c;光子芯片以其低能耗、高速度的特点备受瞩目。首条光子芯片中试线的建立&#xff0c;标志着我国在光电子领域的重大突破&#xff0c;同时也为即将到来的量子计算时代奠定了坚实基…

机器学习python实践——数据“相关性“的一些补充性个人思考

在上一篇“数据白化”的文章中&#xff0c;说到了数据“相关性”的概念&#xff0c;但是在统计学中&#xff0c;不仅存在“相关性”还存在“独立性”等等&#xff0c;所以&#xff0c;本文主要对数据“相关性”进行一些补充。当然&#xff0c;如果这篇文章还能入得了各位“看官…

(Javascript)AI数字人mp4转canvas播放并去除背景绿幕

1、需求介绍 H5页面嵌入AI数字人播报&#xff0c;但生成的数字人是mp4格式且有绿幕背景&#xff0c;需要转成canvas并去除背景&#xff1b; 2、效果&#xff1a; 去除前&#xff1a; 去除后&#xff1a; 3、代码 <!DOCTYPE html> <html lang"en"><…

泉州职业技术大学2024Java期末题库【基础题】

1.根据输入的表示星期几的数字&#xff0c;对应输出它的英文名称。 考察内容:Switch语句的掌握 public class test1 {public static void main(String[] args) {//switch语句复习//创建对象java.util.Scanner input new java.util.Scanner(System.in);//提示输入语句System.ou…