向爬虫而生---Redis 拓宽篇4 <redis持久化 --- RDB章>

前言:

继续上一章:向爬虫而生---Redis 拓宽篇3 <GEO模块>-CSDN博客

这章讲 RDB持久化(快照)

当涉及到Redis的持久化时,有两种主要的实现方法:

快照(Snapshot)和写日志(Write-ahead logs)。

持久化是一种将数据保存在磁盘上,以便在Redis重启后仍然可用的机制。Redis默认将数据保存在内存中,但也提供了持久化来避免数据在内存中丢失。

持久化比较重要,在优化集群数据的时候能派上用场,小规模的数据,可能大家没什么感觉; 但我觉得有必要提一下!!! 以便后期,知道怎么更好优化自己程序.  

正文:

概念:

快照快照(Snapshot)是指将Redis内存中的数据以某种格式(如RDB文件)保存到磁盘上的过程。快照可以在Redis服务器重启、数据备份、数据迁移等场景下使用,以便在需要时能够恢复数据。

快照持久化的过程

  1. 创建快照:Redis通过fork()系统调用创建一个子进程,然后该子进程负责将当前内存中的数据库数据写入到临时文件中。
  2. 写入临时文件:子进程将内存中的数据按照一定的格式写入临时文件。在此过程中,Redis服务器使用子进程的Copy-on-Write(写时复制)技术,确保父子进程之间的数据共享没有冲突。
  3. 替换原始文件:一旦子进程完成写入临时文件的操作,它将临时文件重命名为持久化文件,通常是RDB文件。然后,Redis会将新的持久化文件替换原始的RDB文件,以实现数据的持久化。

快照持久化在Redis中的优点:

  1. 快速恢复:快照持久化使得Redis能够在重启时迅速加载RDB文件并还原数据,减少了服务停机时间。
  2. 数据压缩:RDB文件是二进制格式,可以通过压缩机制减小文件的大小,节省磁盘存储空间。
  3. 数据备份和迁移:通过保存RDB文件,可以将Redis的数据进行备份,并在需要时将数据迁移到其他环境中。

快照可通过使用SAVE指令同步执行,或者使用BGSAVE指令进行异步执行。

  • SAVE指令是同步的,它会阻塞Redis服务器,直到快照过程完成。
  • BGSAVE指令是异步的,它会通过创建一个子进程(fork())来执行快照,允许Redis服务器在后台继续处理其他命令。

   -------上面两个点,记清楚!!!! 一个是同步,一个是异步!!!


RDB的定义和配置方法:

RDB指的是Redis数据库的快照文件,它是Redis使用快照持久化机制生成的文件。这个文件保存了Redis的数据状态,包括键值对以及它们的相关元数据。RDB文件的默认名称是dump.rdb,可以通过配置文件中的dbfilename选项进行修改。

修改配置文件:

  1. 打开Redis的配置文件(通常位于/etc/redis/redis.conf)。
  2. 在文件中找到# dbfilename dump.rdb这一行。注意,前面有一个#符号,表示该行是注释,并且配置项是被禁用的。
  3. 移除前面的#符号,取消注释。
  4. 将dbfilename后面的值修改为你想要的名称,例如:dbfilename mydata.rdb。
  5. 保存并关闭文件。
  6. 重新启动Redis服务器使其加载新的配置文件。

ps:在修改配置文件后,需要重新启动Redis服务器才能使新的配置生效!!


save和bgsave 的优缺点

触发RDB持久化的方式包括SAVE指令和BGSAVE指令,具体如下:

  1.SAVE指令是同步方式触发RDB持久化。它会让Redis服务器创建一个RDB文件,并将数据写入其中,期间会阻塞Redis服务器的主线程,直至持久化完成。如果已经存在RDB文件,SAVE指令将会替换它。
redis-cli
> SAVE
  2.BGSAVE指令是异步方式触发RDB持久化。它会创建一个子进程,在新的Redis实例中执行RDB持久化过程。这种方式不会阻塞Redis服务器的主线程,允许服务器继续处理其他命令。
redis-cli
> BGSAVE

SAVEBGSAVE有各自的优缺点。SAVE的优点是简单直观,可直接通过执行指令进行持久化。然而,它的缺点是会造成阻塞,因为持久化的过程会导致主线程无法处理其他命令。而BGSAVE虽然不会阻塞Redis服务器,但会通过创建子进程增加系统负担


关于持久化的配置选项

如何修改配置,对应是是.conf文件,这里用代码的样子展示,大家可能更直观:

config_file = '/path/to/redis.conf'  # Redis配置文件的路径# 打开配置文件并读取内容
with open(config_file, 'r') as f:lines = f.readlines()# 修改配置文件中的选项
for i in range(len(lines)):line = lines[i].strip()if line.startswith('save'):# 修改自动触发快照持久化的条件lines[i] = 'save 900 1\n'elif line.startswith('dir'):# 修改持久化文件的保存目录lines[i] = 'dir /path/to/save\n'elif line.startswith('dbfilename'):# 修改快照文件的名称lines[i] = 'dbfilename mydata.rdb\n'elif line.startswith('rdbcompression'):# 开启RDB文件的压缩lines[i] = 'rdbcompression yes\n'elif line.startswith('appendonly'):# 启用AOF持久化lines[i] = 'appendonly yes\n'elif line.startswith('appendfilename'):# 修改AOF文件的名称lines[i] = 'appendfilename mydata.aof\n'# 将修改后的配置写回文件
with open(config_file, 'w') as f:f.writelines(lines)# 重启Redis服务器使配置生效
# 请根据实际情况使用Redis服务器的重启方法,例如通过命令行或启动脚本进行重启

redis自动持久化

当针对持久化进行配置时,Redis提供了一种自动触发RDB持久化的方式。这意味着在特定条件下,Redis会自动执行RDB持久化操作,而无需手动触发。以下是这些自动触发RDB持久化的条件的详细说明:

  1. 全量复制(Full Resynchronization):当Redis作为主节点与一个或多个从节点建立全量复制关系时,主节点会自动执行一次RDB持久化操作,并将RDB文件传输给从节点,以便从节点能够初始化自己的数据集。这是因为在建立复制关系时,使用RDB文件可以更有效地将初始数据传输给从节点。

  2. 调试重载(Debug Reload):在某些情况下,开发人员可能需要在调试模式下重新加载Redis服务器。当Redis服务器在调试重载时,它会自动执行RDB持久化,以确保加载后的数据与重启前的数据保持一致。

  3. 关闭服务器(Shutdown):当Redis服务器接收到关闭指令时,它会自动执行RDB持久化,将数据保存到磁盘上。这样,在下次启动Redis服务器时,可以通过加载RDB文件来恢复数据,以避免数据丢失。

在这些情况下,自动触发RDB持久化可以帮助确保数据的一致性和完整性。通过自动执行RDB持久化,Redis能够将数据保存到磁盘上,以便在重启、复制或调试重载等操作后能够恢复数据。

ps:这些自动触发RDB持久化的条件是内置的,无需额外的配置。当满足这些条件时,Redis服务器会自动执行RDB持久化操作。

配置的 自动保存

在Redis配置文件中,通过设置save选项的条件,指定了在特定时间间隔或写操作数量达到一定阈值时自动执行RDB持久化。这意味着无需手动触发RDB持久化,Redis会在满足指定条件时自动执行。

save 900 1
save 300 10
save 60 10000
  1. 自动触发条件:配置指定了三个自动触发条件:900秒内至少有1次写操作、300秒内至少有10次写操作、60秒内至少有10000次写操作。
  2. 一致性和完整性:通过自动触发RDB持久化,Redis可以定期将数据保存到磁盘上的RDB文件中,从而确保数据的一致性和完整性。在Redis执行重启、复制或调试重载等操作后,可以从RDB文件中恢复数据。
  3. 内置条件:这些自动触发RDB持久化的条件是内置的,并无需额外的配置。只需将条件添加到Redis配置文件中,Redis服务器会在满足指定条件时自动执行RDB持久化操作。
好处:

Redis会在特定条件下自动保存数据,减少手动干预的需要,并确保数据的一致性。此机制可提供方便性和保护数据的重要性。

坏处:

  1. 数据丢失风险: 由于自动触发RDB持久化是基于时间间隔或写操作数量的条件来进行的,这意味着在持久化发生之前,如果Redis服务器遇到故障或非正常关闭,可能会导致数据丢失。因为自动触发可能不会实时保存所有最新的修改。
  2. 持久化延迟:自动触发RDB持久化是基于条件触发的,而不是实时进行的。如果在持久化触发之前发生故障,可能会丢失最新的修改。另外,当触发条件较高时,持久化操作可能会延迟服务器的响应,特别是在大型数据集上。
  3. 不灵活的触发条件:使用自动触发RDB持久化时,只能通过设定时间间隔或写操作数量来触发持久化操作。这可能无法满足特定业务需求,例如需要基于其他类型条件触发持久化的情况。
  4. 持久化文件大小较大:当自动触发RDB持久化执行时,会生成一个完整的RDB快照文件。对于大型数据集,这可能导致生成的RDB文件非常大,增加了磁盘存储的需求和持久化操作的时间。
  5. 持久化对服务器性能的影响:自动触发RDB持久化可能会对Redis服务器的性能产生一定影响,特别是在持久化过程中,当生成RDB文件、写入磁盘等I/O操作执行时,可能会导致短暂的性能下降。


明明有了自动持久化,为什么还要手动持久化?

虽然Redis已经提供了自动触发RDB持久化的方式,但手动配置持久化仍然具有一些优点和灵活性,这取决于使用场景和需求。

下面是一些手动配置持久化的原因:

  1. 控制持久化频率:自动触发的RDB持久化方法可能不符合特定的数据保存要求。通过手动配置持久化,可以更精确地控制持久化的频率和时机,以满足特定的业务需求。

  2. 备份和恢复:手动配置持久化使得用户可以根据需要执行数据备份,并在需要时恢复数据。这对于处理故障恢复、数据迁移或快速回滚等任务非常关键。

  3. 数据迁移和复制:手动配置持久化使得可以将持久化文件(如RDB文件)用于数据迁移、复制或分发到其他Redis实例或集群。这样可以更方便地管理和共享数据。

  4. 高级持久化机制:除了RDB持久化,Redis还提供了AOF持久化。手动配置持久化可以让用户选择使用什么持久化方式,并按需配置相关选项,以满足更高级的数据持久化需求。

  5. 多重备份:通过手动配置持久化,可以在多个位置保存多个备份文件,以提高数据的安全性和容灾性。这对于需要更高级别的数据保护和备份策略的环境非常重要。

尽管Redis的自动持久化机制具有可靠性和简便性,手动配置持久化可以提供更加灵活和精确的控制,以满足特定需求。因此,在某些场景下,手动配置持久化仍然是一个有用的选项。

需要根据具体的业务需求和数据安全性的要求来选择是否进行手动配置持久化。

总结:

  文章的最后,需要明白几个概念

        1.快照概念

        2.RDB是个啥

        3.如何配置RDB

        4.自动保存 在哪里设置,怎么设置

        ... 其他的,看一看 图一乐就好...

因为RDB模式下,容易耗时/耗性能;且容易丢失数据!!!

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

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

相关文章

ArcGIS制图技巧总结

Part 1 制图综述 1.1 制图的目的 随着GIS在各行各业的深入应用,各信息化部门和生产单位都逐渐建立起自己的GIS的应用,同时积累了大量的地理数据。随着应用深度和广度的推进,针对数据建立专题应用越来越迫切,对行业专题制图的需…

2024拜年祝福视频AE模板31套

做短视频必备的AE模板非常好看,跨年做个视频非常漂亮,喜欢的赶紧保存吧! 链接:https://pan.quark.cn/s/fc1f3db12049

XML技术分析03

一、XMLHttpRequest 对象 XMLHttpRequest 对象用于在后台与服务器交换数据。 创建 XMLHttpRequest 对象 所有现代浏览器 (IE7、Firefox、Chrome、Safari 以及 Opera) 都内建了 XMLHttpRequest 对象。 通过一行简单的 JavaScript 代码,我们就可以创建 XMLHttpReq…

09.简单工厂模式与工厂方法模式

道生一,一生二,二生三,三生万物。——《道德经》 最近小米新车亮相的消息可以说引起了不小的轰动,我们在感慨SU7充满土豪气息的保时捷设计的同时,也深深的被本土品牌的野心和干劲所鼓舞。 今天我们就接着这个背景&…

Spring和Spring Boot的区别

Spring和Spring Boot是Java开发中非常流行的框架,它们都能够帮助开发者快速构建企业级应用程序。虽然它们都是基于Spring框架的扩展,但是它们之间还是存在一些区别的。 首先,Spring是一个轻量级的控制反转(IoC)和面向…

uniapp 解决安卓App使用uni.requestPayment实现沙箱环境支付宝支付报错

背景:uniapp与Java实现的安卓端app支付宝支付,本想先在沙箱测试环境测支付,但一直提示“商家订单参数异常,请重新发起付款。”,接着报错信息就是:{ "errMsg": "requestPayment:fail [pa…

【书生大模型00--开源体系介绍】

书生大模型开源体系介绍 0 通用人工智能1 InternLM性能及模型2 从模型到应用 大模型成为目前很热的关键词,最热门的研究方向,热门的应用;ChatGPT的横空出世所引爆,快速被人们上手应用到各领域; 0 通用人工智能 相信使…

[蓝桥杯学习] 线段树

学习blibli 定义 线段树是一种特殊的平衡二叉查找树,使用线段树,可以实现数据的添加、查找和删除。 树的根结点表示了一个完整的单元区间,左右孩子的区间是将父结点的区间进行二分,左右孩子的区间之和,就是他们的根…

【机器学习】循环神经网络(四)-应用

五、应用-语音识别 5.1 语音识别问题 详述语音识别的经典方法GMMHMM框架 5.2 深度模型 详述DNN-HMM结构 循环神经网络与CTC技术结构用于语音识别问题 六、自然语言处理 RNN-LM建模方法 6.1 中文分词 6.2 词性标注 6.3 命名实体识别 详述LSTMCRF进行命名实体识别的方法 6.4 文本…

Linux中手动引导启动和密码破解

手动完成/boot/grub2/grub.cfg做的事情 删除内核文件/boot/grub2/grub.cfg ls 先set roothd0,msdos1(表示boot目录所在的分区,因为是在/下,没有给boot单独分区,所以是hd0,msdos1表示是第一块分区) : 加载到boot目录所在的分区 再用linux命令加载内核 linux /vmlinuz-4.18.0-…

ElasticSearch 性能优化

提升写入性能 使用 bulk 接口批量写入 节省重复创建连接的网络开销通过进行基准测试来找到最佳的批处理数量 延长 refresh 的时间间隔 通过延长 refresh(刷新)的时间间隔可以降低段合并的频率,段合并十分耗费资源默认的刷新频率为1s&…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《基于两阶段随机优化的电能量与深度调峰融合市场出清模型及定价方法》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主的专栏栏目《论文与完整程序》 这个标题涉及到一个电力市场的建模和定价方法,采用了两阶段随机优化的策略,目标是实现电能量与深度调峰的融合。下面是对标题中各个…

【Unity】云的渲染

简述: 大佬总结的方法很多,不重复造轮子和搬运,所参考的链接,和测试的demo在Gitee里。 基于Mesh顶点偏移的云海效果(Done)基于面片和噪声的云效果(Done)基于模型的体积云&#xff…

MicroPython的Manifest文件介绍

摘要 MicroPython除了能够从文件系统加载Python代码外,还可以把Python代码“冻结”到固件加载,这样做有几个好处: 代码已被预编译为字节码,无需在加载时编译Python源代码。字节码可以直接从ROM(即闪存)中…

百度搜索金融:构建高时效、高可用的分布式数据传输系统

作者 | 搜索技术平台研发部 导读 分布式数据传输系统是一种用于在多个计算节点之间高效传输大量数据的系统,诣在高效的解决大规模数据迁移、备份、跨地域复制等问题,其广泛应用在实时数据流传输、跨数据中心数据迁移、多媒体传输等场景,在大多…

智能合约:3分钟开发ERC20 token(2)

0.前言 上一节我们讲到了开发智能合约的准备工作,以及在线编程平台remix 智能合约(1) 这一节讲解如何开发、发行一个代币,并具备包括代币铸造mint,转账transfer和销毁burn功能,并确保合约拥有者owner的权限…

Tracert 与 Ping 程序设计与实现(2024)

1.题目描述 了解 Tracert 程序的实现原理,并调试通过。然后参考 Tracert 程序和计算机网络教材 4.4.2 节, 计算机网络 课程设计指导书 2 编写一个 Ping 程序,并能测试本局域网的所有机器是否在线,运行界面如下图所示的 QuickPing …

【docker】centos 使用 Nexus Repository 搭建私有仓库

Nexus Repository 是一种流行的软件仓库管理工具,它可以帮助您搭建私有仓库,以便在内部网络或私有云环境中存储、管理和分发各种软件包和组件。 它常被用于搭建Maven的镜像仓库。本文演示如何用Nexus Repository搭建docker 私有仓库。 使用Nexus Repos…

架构设计的历史背景

理解了架构的有关概念和定义之后,就需要知道架构设计的历史背景。我认为,如果想要深入理解这个事物的本质,最好的方式就是去追寻这个事物出现的历史背景和推动因素。 我们先来简单梳理一下软件开发进化的历史,探索一下软件架构出…

毕业设计:基于机器学习xgboost lgbm adaboost 的空气质量预测pm2.5‘, ‘so2‘, ‘no2‘ 完整代码数据-可直接运行

项目详细视频讲解介绍: 基于机器学习xgboost lgbm adaboost 的空气质量预测-完整代码数据可直接运行_哔哩哔哩_bilibili 数据展示: 运行结果展示: 项目代码: from sklearn import preprocessing import random from sklearn.model_selection import train_test_split fr…