【Redis技术探索】「底层架构原理」帮你从底层彻底吃透RDB技术原理(入门第一步)

news2025/2/6 20:25:38

每日一句

低头是一种能力,它不是自卑,也不是怯弱,它是清醒中的嬗变。有时,稍微低一下头,或者我们的人生路会更精彩。

前提概要

Redis是一个的键-值(K-V)对的内存数据库服务,通常包含了任意个非空数据库。而每个非空的键值数据库中又可以存放任意个K-V,基本的结构如下图所示:

  • Redis的强劲性能很大程度上是由于其将所有数据都存储在了内存中,为了使Redis在重启之后仍能保证数据不丢失,需要将数据从内存中以某种形式同步到硬盘中,这一过程就是持久化。

  • 我们知道redis中缓存的数据都存放在内存中,一旦服务故障,会导致内存中数据丢失,所以需要一种数据持久化的方案,将redis内存中的数据,写入磁盘,当redis重启后,能从磁盘中恢复数据。

Redis服务器的结构

  • 这里有一个问题,因为Redis是一个内存数据库,如果它直接将数据存储到内存中,但是如果不考虑将存储在内存中的数据持久化到硬盘里面,一旦服务器进程退出,那么数据库中的数据也会消失。

  • 数据库的持久化机制主要有两种,一种是RDB机制,另外一种是AOF机制,AOF机制已经在前面的文章中介绍过了,

  • 如果有兴趣可以去看看,而本文主要讲述RDB机制。

RDB持久化方式

RDB持久化是指在指定的时间间隔内将redis内存中的数据集快照写入磁盘,实现原理是redis服务在指定的时间间隔内先fork一个子进程,由子进程将数据集写入临时文件,写入成功后,再替换之前的文件,用二进制压缩存储,生成dump.rdb文件存放在磁盘中。

RDB机制

  • Redis提供了RDB持久化能力,这个功能可以将Redis在内存中的数据库状态保持在磁盘里面,避免数据意外丢失。

  • RDB持久化机制可以手动执行,也可以根据服务器配置选定定期执行操作,该功能可以将某一个时间点的数据快照进行保存到一个RDB文件中。

RDB优势

  • 一旦采用该方式,那么你的整个Redis数据库将只包含一个文件,这对于文件备份而言是非常完美的。比如,你可能打算每个小时归档一次最近24小时的数据,同时还要每天归档一次最近30天的数据。通过这样的备份策略,一旦系统出现灾难性故障,我们可以非常容易的进行恢复。

  • 对于灾难恢复而言,RDB是非常不错的选择。因为我们可以非常轻松的将一个单独的文件压缩后再转移到其它存储介质上。

  • 性能最大化。对于Redis的服务进程而言,在开始持久化时,它唯一需要做的只是fork出子进程,之后再由子进程完成这些持久化的工作,这样就可以极大的避免服务进程执行IO操作了。

  • 相比于AOF机制,如果数据集很大,RDB的启动效率会更高。

RDB劣势

  • 如果你想保证数据的高可用性,即最大限度的避免数据丢失,那么RDB将不是一个很好的选择。因为系统一旦在定时持久化之前出现宕机现象,此前没有来得及写入磁盘的数据都将丢失。

  • 由于RDB是通过fork子进程来协助完成数据持久化工作的,因此,如果当数据集较大时,可能会导致整个服务器停止服务几百毫秒,甚至是1秒钟。

RDB配置规则

在redis的6379.conf配置文件中:

备份配置参数

save <seconds> <changes>

save <指定时间间隔> <执行指定次数更新操作>,满足条件就将内存中的数据同步到硬盘中。官方出厂配置默认是 900秒内有1个更改,300秒内有10个更改以及60秒内有10000个更改,则将内存中的数据快照写入磁盘。

save 900 1      #在900秒(15分钟)之后,如果至少有一个key发生变化,则dump内存快照
save 300 10     #在300秒(15分钟)之后,如果至少有10个key发生变化,则dump内存快照
save 60 10000   #在60秒(1分钟)之后,如果至少有10000个key发生变化,则dump内存快照

文件配置参数

默认的rdb文件路径是当前目录,文件名是dump.rdb,可以在配置文件中修改路径和文件名,分别是dir和dbfilename.

# 存放快照的目录
dir ./ # rdb文件存储路径
dbfilename dump.rdb # rdb文件名

压缩配置参数

在进行镜像备份时,是否进行压缩。

rdbcompression yes  #Redis默认是开启压缩的。
# yes:压缩,但是需要一些cpu的消耗。
# no:不压缩,需要更多的磁盘空间。

如果没有触发自动快照,需要对Redis执行手动快照操作,save和bgsave命令来手动快照,两个命令是:

  • SAVE:由主进程进行快照,会阻塞其他请求。
  • BGSAVE:通过fork子进程进行快照,不会阻塞其他请求。

注意:由于Redis使用fork来复制一份当前进程,那么子进程就会占有和主进程一样的内存资源,比如说主进程8G内存,那么在备份的时候,必须保证有16G的内存,要不然会启用虚拟内存,性能非常的差。

快照的过程如下:

  1. Redis使用fork函数复制一份当前进程(父进程)的副本(子进程);
  2. 父进程继续接收并处理客户端发来的命令,而子进程开始将内存中的数据写入硬盘中的临时文件;
  3. 当子进程写入完所有数据后会用该临时文件替换旧的RDB文件,至此一次快照操作完成。(注意:会存在写一部命令压缩缓存区,记录写入rdb文件时候的操作)

在执行fork的时候操作系统会使用写时复制(copy-on-write)策略,即fork函数发生的一刻父子进程共享同一内存数据,当父进程要更改其中某片数据时(如执行一个写命令),操作系统会将该片数据复制一份以保证子进程的数据不受影响,所以新的RDB文件存储的是执行fork时那一刻的内存快照数据。

通过上述过程可以发现Redis在进行快照的过程中不会修改RDB文件,只有快照结束后才会将旧的文件替换成新的,也就是说任何时候RDB文件都是完整的。这使得可以通过定时备份RDB文件来实现Redis数据库备份。

快照的过程压缩分析:

RDB文件是经过压缩(上文介绍了:可以配置rdbcompression参数以禁用压缩节省CPU占用)的二进制格式,所以占用的空间会小于内存中的数据大小,更加利于传输。

快照的读取加载过程:
  • Redis启动后会读取RDB快照文件,将数据从硬盘载入到内存。根据数据量大小与结构和服务器性能不同,这个时间也不同。通常将一个记录一千万个字符串类型键、大小为1GB的快照文件载入到内存中需要花费20~30秒钟

  • 通过RDB方式实现持久化,一旦Redis异常退出,就会丢失最后一次快照以后更改的所有数据。这就需要开发者根据具体的应用场合,通过组合设置自动快照条件的方式来将可能发生的数据损失控制在能够接受的范围。如果数据很重要以至于无法承受任何损失,则可以考虑使用AOF方式进行持久化。

RDB 的优缺点

优点:

  1. 适合大规模的数据恢复。
  2. 如果业务对数据完整性和一致性要求不高,RDB是很好的选择。

缺点:

  1. 数据的完整性和一致性不高,因为RDB可能在最后一次备份时宕机了。
  2. 备份时占用内存,因为Redis 在备份时会独立创建一个子进程,将数据写入到一个临时文件(此时内存中的数据是原来的两倍),最后再将临时文件替换之前的备份文件。
  3. 由于RDB是通过fork子进程来协助完成数据持久化工作的,因此,如果当数据集较大时,可能会导致整个服务器停止服务几百毫秒,甚至是1秒钟。(回写和覆盖的时候用的是主进程)。

RDB与AOF二者选择的标准(虽然还没有讲AOF,提前普及)

  • 如果系统是愿意牺牲一些性能,换取更高的缓存一致性(aof)

  • 或者是愿意写操作频繁的时候,不启用备份来换取更高的性能,待手动运行save的时候,再做备份(rdb)。

Redis允许同时开启AOF和RDB,既保证了数据安全又使得进行备份等操作十分容易。此时重新启动Redis后Redis会使用AOF文件来恢复数据,因为AOF方式的持久化可能丢失的数据更少。

总结

  • Redis 默认开启RDB持久化方式,在指定的时间间隔内,执行指定次数的写操作,则将内存中的数据写入到磁盘中。

  • RDB 持久化适合大规模的数据恢复但它的数据一致性和完整性较差。

  • Redis 需要手动开启AOF持久化方式,默认是每秒将写操作日志追加到AOF文件中。

所以Redis的持久化和数据的恢复要选择在夜深人静的时候执行是比较合理的。

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

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

相关文章

读取csv格式的数据--Pandas

1. 函数功能 读取逗号分隔数据的文件comma-separated values (csv) 2. 函数语法 pandas.read_csv(filepath_or_buffer, *, sep_NoDefault.no_default, delimiterNone, headerinfer, names_NoDefault.no_default, index_colNone, usecolsNone, squeezeNone, prefix_NoDefau…

氢燃料电池汽车的前景、主要优势及发展难点

氢燃料电池汽车的前景 氢燃料电池&#xff08;电动&#xff09;汽车的关键所在和奥秘之处&#xff0c;在于它的动力来源—氢燃料电池近乎完美和非常理想的工作原理与机制&#xff0c;它名义上叫“电池”&#xff0c;而实质上是一种基于化学原理&#xff0c;将作为“燃料”&…

java 瑞吉外卖 day5 套餐管理业务 套餐新增,套餐分页查询 套餐修改 套餐停售起售设置 短信服务

新增套餐 准备工作&#xff1a; 套餐信息分页查询 前面已经写了好几个分页查询了&#xff0c;这里查询的关键点&#xff0c;是套餐分类名称&#xff0c;不在套餐表中&#xff0c;我们要到别的表里拿&#xff0c;然后封装进setmealDto GetMapping("/page") public R p…

二维周期光栅结构的配置

摘要 复杂光学光栅结构被广泛用于多种应用&#xff0c;如光谱仪、近眼显示系统等。利用傅里叶模态法(FMM&#xff0c;或称RCWA) VirtualLab Fusion 提供了一种用于任意光栅结构严格分析的简单方法。利用图形用户界面&#xff0c;用户可以设置堆栈的几何形状&#xff0c;从而产生…

【实战】一次简单的log4j漏洞测试

更新时间&#xff1a;2021.12.19 参考文档&#xff1a;https://www.yuque.com/u8021480/crow/dg9xax 在去年log4j漏洞刚爆发的时候&#xff0c;很多平台都存在漏洞&#xff0c;当时也在第一时间在有授权的情况下对某论坛进行了渗透测试&#xff0c;结果发现存在漏洞&#xff0…

gitlabjenkins

使用容器安装gitlab 1.添加容器 docker run --detach \ --hostname 192.168.44.103 \ --publish 443:443 --publish 80:80 \ --name gitlab \ --restart always \ --volume $GITLAB_HOME/config:/etc/gitlab:Z \ --volume $GITLAB_HOME/logs:/var/log/gitlab:Z \ …

用javascript分类刷leetcode9.位运算(图文视频讲解)

位运算基础&#xff1a; 程序中所有的数载计算机内存中都是以二进制存储的&#xff0c;位运算就是直接对整数在内存中的二进制进行操作&#xff0c;由于直接在内存中进行操作&#xff0c;不需要转成十进制&#xff0c;因此处理速度非常快 常见位运算 x & 1 0 //判断奇偶…

领略设计模式的魅力,谈谈组合模式搭配访问者模式

组合模式&#xff08;composite&#xff09; 我们都知道文件和文件夹的概念&#xff0c;并且文件是可以存放在文件夹中&#xff0c;文件夹中也可以存放其他文件夹。需要设计一个简单的程序来实现文件夹和文件的关系。 实现思路 文件夹需要存放文件夹和文件&#xff0c;首先想到…

大恒普信携手昇思推出眼健康AI智能分析系统,为眼科医疗行业数字化转型升级助力

电子屏幕时代&#xff0c;人们的用眼强度不断增加&#xff0c;各种眼底疾病也开始广泛出现&#xff0c;如青光眼、病理性近视、糖尿病视网膜病变等&#xff0c;严重时可致盲。其实&#xff0c;对大多数眼底疾病而言&#xff0c;如果能早发现、早治疗&#xff0c;就可以很好地预…

把d盘的文件删除了,怎么恢复?d盘的文件删除了怎么找回

把d盘的文件删除了,怎么恢复&#xff1f;通常&#xff0c;我们删除d盘文件的情况是不一样的&#xff0c;可能是通过不同的方法删除的&#xff0c;针对不同的删除方式&#xff0c;那么要恢复这些文件的方法也是不同的&#xff0c;小编按删除方式和时间来给大家进行详细的讲解。 …

TensorFlow手动搭建神经网络实现鸢尾花分类

步骤 准备数据 搭建网络 定义神经网络中所有可训练参数 参数优化 嵌套循环迭代&#xff0c;with结构更新参数&#xff0c;显示当前loss 测试效果 计算当前参数前向传播后的准确率&#xff0c;显示当前acc acc/loss可视化 这里使用一个最简单的网络实现鸢尾花分类 完整代码…

一文搞定 Postman 接口自动化测试

本文适合已经掌握 Postman 基本用法的读者&#xff0c;即对接口相关概念有一定了解、已经会使用 Postman 进行模拟请求等基本操作。 工作环境与版本&#xff1a; Window 7&#xff08;64位&#xff09; Postman &#xff08;Chrome App v5.5.3&#xff09; P.S. 不同版本页面…

Vue中在组件中单独使用this

目录 &#x1f53d; 全局注册 &#x1f53d; 局部注册 &#x1f53d; 组件使用总结 &#x1f53d; 全局注册 1、Vue.prototype 在多个地方都需要使用但不想污染全局作用域的情况下&#xff0c;这样定义&#xff0c;在每个 Vue 实例中都可用。$ 表示这是一个在 Vue 所有实…

Allegro如何查看PCB进度百分比操作指导

Allegro如何查看PCB进度百分比操作指导 Allegro支持实时查看PCB进度百分比,让设计者实时了解设计进度,具体操作如下 选择Display-StatusUnrouted connections这里就是就剩下未完成的百分比,如果是0,代表已经完成除了可以在这里快捷的查看,也可以通过报表实现,选择Tools-r…

InstructPix2Pix: 随口修图

InstructPix2Pix Learning to Follow Image Editing Instructions是一篇非常有意思的文章&#xff0c;有意思说的是效果&#xff0c;要做出论文的效果过程并没那么顺利。首先需要微调GPT3模型&#xff0c;这个花钱花力气&#xff0c;在之前的文章里已经提过&#xff0c;可以参考…

RedisSon分布式锁 源码解析,在 java 中使用 redis + lua 做秒杀

1. RedisSon 分布式锁 <dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>3.17.0</version> </dependency>spring:profiles:active: devredis:cluster:nodes: 192…

Mac OSX 安装 MongoDB

1&#xff0c;简介 MongoDB是由C语言编写&#xff0c;开源而且基于分布式文件存储的介于关系数据库和非关系数据库之间的产品&#xff1b;在高负载的情况下&#xff0c;通过添加更多节点保证服务器性能&#xff1b;旨在为WEB应用提供可扩展的高性能数据存储解决方案&#xff1…

Copy-Paste

在2D视觉目标检测领域&#xff0c;由相似目标之间的重叠引起的拥挤是普遍存在的挑战。 文章地址&#xff1a;https://arxiv.org/pdf/2211.12110.pdf 研究者首先强调了拥挤问题的两个主要影响&#xff1a;1&#xff09;IoU置信度相关干扰&#xff08;ICD&#xff09;和2&#…

桥接模式

文章目录桥接模式1.桥接模式的本质2.何时选用桥接模式3.优缺点4.桥接模式的结构5.实现模拟消息发送MVC在桥接模式的体现桥接模式 桥接模式实质就是分离抽象和实现&#xff0c;抽象部分有多种&#xff0c;实现部分有多种&#xff0c;耦合在一起很难扩展&#xff0c;将其分离开来…

excel如何排序?两个方法汇总

排序是Excel中最常用的功能之一&#xff0c;也是数据分类和汇总操作的重要前提。excel如何排序&#xff1f;本文介绍如何给Excel里面的数据进行排序&#xff0c;方法很简单。感兴趣的朋友&#xff0c;赶紧来看看吧&#xff01; 操作环境&#xff1a; 演示机型&#xff1a;Dell …