Redis持久化——RDF与AOF两种方式怎么做?有什么区别?

news2024/10/5 5:13:11

目录

1. 什么是RDB 

2. save 和 bgsave 命令主动保存数据

2.1 save

2.2 bgsave

3. Redis 内部自动RDB机制

4. RDB 底层是如何实现 bgsave 的?

5. RDB 的缺点

6. 什么是AOF?

7. AOF文件的缺点?

8. AOF 重写文件配置

9. RDB 与 AOF 的区别


1. 什么是RDB 

RDB全称是 Redis Database file(Redis数据备份文件),也被叫做Redis数据快照。

它的原理也很好理解,因为Redis本身是基于内存的,一旦服务器宕机或停电,数据就会丢失,因此 Redis 它本身就带有数据备份的一个功能,它会每隔一段时间将数据从内存写入到磁盘进行保存,保存的数据形成的文件我们就称它为快照,当我们重启 Redis 之后,它就会再次读取快照文件中的数据,将数据恢复,防止数据的丢失,RDB文件默认保存在当前运行目录。

如下图所示,我使用 FinalShell 启动了Redis 的客户端server与服务端cli,pingPong正常,set存和get取也没问题,我们可以看到,在当前运行目录 "myredis" 下,就有一个dump.rdb的文件。它就是数据快照文件

2. save 和 bgsave 命令主动保存数据

2.1 save

save 命令是由 Redis  主进程来执行RDB操作,因为Redis 是单线程的,所以该命令会阻塞所有命令,我们只需要输入 save 即可开启快照保存。

如下图所示,我使用 save 命令保存数据,然后关闭Redis再重新启动,此时我没有存储数据,再次 get 获取刚才存储的 name1,可以看到我仍然可以获取到,这就是 save 的功能,可以将我们的数据进行持久化保存。

但一般情况下我们不推荐使用这个命令,因为它会阻塞命令,而且如果内存中保存的数据量较大,写操作是非常耗费时间的。

2.2 bgsave

bgsave 全称也叫 Background saving started,意味后台保存,它是来开启一个子进行保存工作,而主进程则不受影响。

这里的话也很简单,就和刚才一样运行以下命令即可,就不做演示了。

3. Redis 内部自动RDB机制

除了刚才我所说的手动保存数据的两个命令以外,Redis 内部还提供了自动触发RDB机制,我们可以在 redis.conf 配置文件中找到。

这里补充一点,Redis 内部的RDB机制默认也是使用的 bgsave 命令。

图中的 save 3600 1 表示3600秒之内有一次修改则进行RDB,save 300 100 表示300秒内有100此操作进行一次RDB,save 60 10000 表示60秒内有一万次操作进行一次RDB。

我们的RDB触发机制应该根据实际业务需求做设置,不能让 basave 过于频繁,尽管是子进程在保存,但还是会消耗资源;但也不能设置的较难触发,否则一旦长时间数据未保存,宕机造成数据丢失的后果也是较为严重的,因此我们需要在这两个方面做取舍,设置一个合理的触发时机,通常我们就可以选择 save 300 100,也可以自定义设置。

4. RDB 底层是如何实现 bgsave 的?

当 Redis 在进行bgsave 持久化操作时,刚才我们知道了,该操作是开启了一个子进程来执行的。bgsave 命令虽然开启了一个子进程避免主进程阻塞,但是在 fork 主进程的这个过程中,主进程仍然是处于阻塞状态的。此时主进程就不能接受用户请求。

得到子进程之后,子进程就可以共享主进程的内存数据,然后读取内存中的数据写入到 RDB 文件。大致流程如下图所示

Redis 是把数据存储在内存中的,但是在 Linux 操作系统底层,操作系统它是不会让这些线程去直接接触内存中的数据的,而是给进程一个页表,你可以把它理解为名单,你要做什么操作,直接在名单上去做,然后操作系统会代替你去执行。而我们在进行 fork 时,其实就是 fork 的页表,然后从页表中去读取数据,再写入到磁盘中。

但是这种情况下会有个问题,如果我的子进程正在读写数据,而主进程却要去修改数据,这个时候就会产生冲突。

因此,为了解决这种情况的发生,fork 采用的是copy-on-write 的技术

当我们子进程向磁盘去写数据的时候,fork 会把内存中的可能产生冲突的共享数据标记为 readOnly(只读),任何一个进程都只能来读数据而不能写数据,当我们的主进程想要去修改数据的时候,它会先把要写的数据完整的拷贝一份出来(如下图数据B副本),然后对拷贝的数据进行写操作当我们主进程再去读的时候,也会读到拷贝的数据,主进程页表与内存中数据的映射关系发生了改变。如下图所示

这是少数数据发生修改时可能出现的情况,还有一种比较罕见的情况,如果我们的数据较多,写的过程比较慢,在这个过程中,大量的数据都发生了修改,那么在操作系统底层会把这些修改的数据全部复制一份,如果再复制数据之前,内存已经快要被Redis 的数据占满了,那么在复制数据的过程中,就会出现内存溢出的情况各位明白吧,就是你现在需要这么多内存空间去复制数据,但是内存不够了,导致内存溢出。这种情况虽然比较罕见,但我们仍需要考虑在内,因此,我们Linux 操作系统在给 Redis 分配内存的时候,通常不会把全部的内存全部交给Redis,而是会保留一部分,防止内存溢出这种情况的发生。

5. RDB 的缺点

通过上面的描述,我们也大概能总结出RDB持久化方案的两个缺点

(1)RDB 执行时间间隔长,两次RDB之间写入数据有丢失风险;

(2)fork 子进程,压缩,写出RDB文件都比较耗时;

6. 什么是AOF?

AOF 全程 Append Only File(追加文件)。Redis 处理的每一个命令都会记录在AOF文件中,可以把它看作是命令日志文件。

AOF在Redis 中是默认关闭的,需要我们在配置文件中去开启,在配置文件中找到相关配置如下。

appendonly:默认为no,改为yes即可进行开启;

appendfilename:"appendonly.aop" 是AOF的文件名称,这里不需要改;

下面还有一个 appendfsync 表示命令记录的频率。

always:表示每执行一次写命令,立即记录到AOF文件中;

everysec:写命令执行先放入AOF缓冲区,然后每隔一秒将缓冲区数据写到AOF文件中,是默认选项;

no:写命令执行先放入缓冲区,由操作系统决定何时写入到磁盘;

三者的对比如下图所示

7. AOF文件的缺点?

AOF 文件它会把所有的操作命令全部都记录下来,就算你对同一个数据进行多次修改操作,但是AOF文件仍然还是会把所有之前的操作命令全部都记录下来,所以AOF文件的大小通常都会比RDB文件要大。

但是,我们可以通过 "bgrewriteaof" 命令让 AOF 文件执行重写功能,用最少的命令达到小童的效果。

举例,我在对 Redis 进行了三次操作,set name zhangsan;set age 18;set name lisi;

经过AOF重写功能之后,上面的三个命令就会转化成 mset name lisi age 18;将三个命令简化成一个命令,减少了所占的存储空间。

8. AOF 重写文件配置

Redis 的AOF文件重写也是有触发阈值的,我们可以使用默认的,也可以在 redis.conf 配置文件中自行配置,这里我截取了配置文件中的一段

auto-aof-rewrite-percentage:后面表示的是百分数,这次的文件相比上次的文件体积增加了百分之百时,就会触发重写;

auto-aof-rewrite-min-size:表示AOF 文件最小为64mb 时会触发重写;

9. RDB 与 AOF 的区别

RDB与AOF都有各自的优缺点,它们的区别大致就如下表中所呈现的,在实际开发过程中往往会结合二者来使用。

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

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

相关文章

Unexpected mutation of “xxxx“ prop

原因 是因为子级修改了父级的数据,所以eslint执行的时候报了这个错 修复方式 1 如果是弹窗等组件,可以根据功能进行修改,比如我这块用的 element ui 的 dialog,便可以改成这样 使用 model-value 代替 修复方式 2 新建子组件…

CTFhub-文件上传-MIME绕过

用哥斯拉生成 php 木马文件 1.php 抓包---> 修改 conten-type 类型 为 imge/jpeg 用蚁剑连接 ctfhub{8e6af8109ca15932bad4747a}

云计算的三个主要服务模型:IaaS、PaaS 和 SaaS

文章目录 介绍基础设施即服务(Infrastructure as a Service,IaaS)平台即服务(Platform as a Service,PaaS)软件即服务(Software as a Service,SaaS) 区别基础设施即服务&…

VS2022 Community 安装步骤

VS2022 Community 安装步骤(C语言学习) 1. 下载地址2. 安装步骤 1. 下载地址 链接: VS2022 Community下载地址 2. 安装步骤 双击图标进行安装。 点击【继续】后等待安装。 选择需要的安装包并修改安装位置,然后点击【安装】。 点击安装…

vue 小黑记事本

vue 小黑记事本 下面这个界面用html和css 如何搞出来?

市面上的ipad国产触控笔怎么样?适合开学买电容笔推荐

自从ipad之类的平板电脑上出现了电容笔,电容笔就成功的取代了我们的手指,大大加快了我们的写作速度。不过,苹果推出的这款电容笔,由于其特殊的压感和芯片技术,价格一直很贵,很多人都很难买得起,…

Error encountered when performing Introspect database postgres schema

我在使用postgresql数据库的时候遇到了这两个异常: 并且查看不到数据库里的表信息 Error encountered when performing Introspect database postgres schema public (details): 错误: 字段 t.relhasoids 不存在 Error encountered when performing Introspect database pos…

Python钢筋混凝土结构计算.pdf-混凝土强度设计值

计算原理: 需要注意的是,根据不同的规范和设计要求,上述公式可能会有所差异。因此,在进行混凝土强度设计值的计算时,请参考相应的规范和设计手册,以确保计算结果的准确性和合规性。 代码实现: …

2023年天府杯——C 题:码头停靠问题

问题背景: 某个港口有多个不同类型的码头,可以停靠不同种类的船只。每 艘船只需要一定的时间来完成装卸货物等任务,并且每个码头有容量 限制和停靠时间限制。港口需要在保证收益的情况下,尽可能地提高 运营效率和降低成本。同…

快速上手: Linux环境配置, 基本指令与项目部署要点

文章目录 1. Linux前置知识1.1. 什么是Linux1.2. Linux环境的搭建 2. Linux常用命令lscd pwdtouch cat more echo mkdirvi/vimrm cp mvgrep ps netstat 管道符yum相关Linux权限 3. 使用Linux部署Servlet项目3.1. 安装JDK3.2. 安装Tomcat3.3. 通过yum安装MariaDB3.4. 部署Servle…

vue3和vue2的主要区别

Vue 3 和 Vue 2 之间有几个主要的区别: 性能优化:Vue 3 在性能方面进行了一些改进,包括更快的渲染速度和更小的包大小。Vue 3 使用了新的响应式系统,可以更好地追踪依赖关系,从而提高了渲染性能。 Composition API&am…

深圳科普宣传片的重要性

科普宣传片是指科学普及宣传片,旨在向公众传播科学知识、提高科学素养、促进科学文化的传播和科学教育。接下来由深圳科普宣传片制作公司老友记小编从以下几个方面浅析科普宣传片的重要性: 1.普及科学知识:科普宣传片可以向大众传达科学知识,…

PYTHON用户流失数据挖掘:建立逻辑回归、XGBOOST、随机森林、决策树、支持向量机、朴素贝叶斯和KMEANS聚类用户画像...

原文链接:http://tecdat.cn/?p24346 在今天产品高度同质化的品牌营销阶段,企业与企业之间的竞争集中地体现在对客户的争夺上(点击文末“阅读原文”获取完整代码数据)。 “用户就是上帝”促使众多的企业不惜代价去争夺尽可能多的客…

【紫光同创国产FPGA教程】——【PGL22G第六章】密码锁实验例程

本原创教程由深圳市小眼睛科技有限公司创作,版权归本公司所有,如需转载,需授权并注明出处 适用于板卡型号: 紫光同创PGL22G开发平台(盘古22K) 一:盘古22K开发板(紫光同创PGL22G开发…

「2024」预备研究生mem-相同元素问题仅选取隔板法相邻与不相邻问题

一、相同元素问题&仅选取&隔板法&相邻与不相邻问题 不理解可以不考虑这种方法: 隔板法: 使用分堆分配,此时比较麻烦:

基于Java+SpringBoot+Vue前后端分离智能学习平台系统设计和实现

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…

part-01 C++知识总结(程序的内存分区、多态的实现)

总结来自:拓跋阿秀大佬的面试知识网站,侵权删 一.程序的内存分区/程序模型 内存分区分别是堆、栈,自由存储区,全局/静态存储区、常量存储区和代码存储区。 栈:在执行函数时,函数内局部变量的存储单元都可以…

centos升级python3.10,中间遇到问题,终于解决了

升级为python3.10 yum updateyum install openssl-devel bzip2-devel libffi-develyum groupinstall "Development Tools"wget https://www.python.org/ftp/python/3.10.2/Python-3.10.2.tgztar -xzf Python-3.10.2.tgzcd Python-3.10.2./configure --enable-optimi…

OpenCV(九):LUT查找表

LUT(Look-Up Table)查找表是OpenCV中一种常用的图像处理方法,用于对图像进行像素级别的颜色映射或图像增强操作。LUT查找表可以实现快速、高效的颜色转换和像素操作,尤其在处理大量像素的情况下具有优势。以下是关于OpenCV LUT查找…

王传福猛男落泪,比亚迪疯狂赚钱

作者|丁广胜 出品|网易科技智见焦点 厮杀告一段落,成绩揭晓。 降价、吵架、还有眼泪,充斥在这略显漫长的2023上半年。 先看一组数据,上半年比亚迪新能源汽车销售151.78万辆,特斯拉是54万辆、理想汽车是14万…