【Redis】——RDB快照
Redis 是内存数据库,但是它为数据的持久化提供了两个技术,一个是AOF日志,另一个是RDB快照:
- AOF 文件的内容是操作命令;
- RDB 文件的内容是二进制数据。
RDB 快照就是记录某一个瞬间的内存数据,记录的是实际数据,而 AOF 文件记录的是命令操作的日志,而不是实际的数据。
因此在 Redis 恢复数据时, RDB 恢复数据的效率会比 AOF 高些,因为直接将 RDB 文件读入内存就可以,不需要像 AOF 那样还需要额外执行操作命令的步骤才能恢复数据
快照的使用
Redis 提供了两个命令来生成 RDB 文件,分别是 save 和 bgsave,他们的区别就在于是否在「主线程」里执行:
- 执行了 save 命令,就会在主线程生成 RDB 文件,由于和 执行操作命令 在同一个线程,所以如果写入 RDB 文件的时间太长,会阻塞主线程;
- 执行了 bgsave 命令,会创建一个子进程来生成 RDB 文件,这样可以避免主线程的阻塞
Redis 可以 通过配置文件的选项来实现每隔一段时间 自动执行一次 bgsave 命令,默认会提供以下配置:
save 900 1 #900 秒之内,对数据库进行了至少 1 次修改;
save 300 10 #300 秒之内,对数据库进行了至少 10 次修改
save 60 10000 #60 秒之内,对数据库进行了至少 10000 次修改
只要满足上面任何一个条件,都会自动 执行一次 bgsave 命令 生成RDB文件
- Redis 的快照是全量快照,也就是说每次执行快照,都是把 内存中的「所有数据」都记录到磁盘中。所以 执行快照是一个比较重的操作。
- 如果 执行频率太频繁,可能会对 Redis 性能产生影响
- 通常 可能设置 至少 5 分钟才保存一次快照,这时如果 Redis 出现宕机等情况,则意味着最多可能丢失 5 分钟数据
因此redis服务器宕机,RDB快照损失的数据比AOF日志损失的数据要多。
执行快照时,数据能被修改吗?
执行 bgsave 过程中,由于是交给子进程来构建 RDB 文件,主线程还是可以继续工作的,关键的技术就在于写时复制技术(Copy-On-Write, COW)。
执行 bgsave 命令的时候,会通过 fork() 创建子进程,此时 子进程 和 父进程 是共享同一片内存数据的,因为创建子进程的时候,会复制父进程的页表,但是页表指向的相同的物理内存

只有在发生修改内存数据的情况时,物理内存才会被复制一份:

如果主线程(父进程)要修改共享数据里的某一块数据(比如键值对 A)时,就会发生写时复制,于是这块数据的 物理内存就会被复制一份(键值对 A'),然后主线程在这个数据副本(键值对 A')进行修改操作。与此同时,bgsave 子进程可以继续把原来的数据(键值对 A)写入到 RDB 文件。
但是程刚修改的数据,子线程 是没办法在这一时间写入 RDB 文件的,只能交由下一次的 bgsave 快照。
所以 Redis 在使用 bgsave 快照过程中,如果主线程修改了内存数据,不管是否是共享的内存数据,RDB 快照都无法写入主线程刚修改的数据,因为此时主线程(父进程)的内存数据和子进程的内存数据已经分离了,子进程写入到 RDB 文件的内存数据只能是原本的内存数据
RDB 和 AOF 合体
即使 RDB 比 AOF 的数据恢复速度快,但是快照的频率不好把握:
- 如果频率太低,两次快照间一旦服务器发生宕机,就可能会比较多的数据丢失;
- 如果频率太高,频繁写入磁盘和创建子进程会带来额外的性能开销。
混合使用 AOF 日志和内存快照
它的作用是 既有 AOF 丢失数据少 和 又有 RDB 恢复速度快 的优点;
如果想要开启混合持久化功能,可以在 Redis 配置文件 将下面这个配置项设置成 yes:
aof-use-rdb-preamble yes
当开启了混合持久化后,在 AOF 重写日志时:
fork出来的重写子进程会先将与主线程共享的 内存数据 以 RDB 方式写入到 AOF 文件。- 同时, 主线程处理的操作命令会被记录在重写缓冲区里,重写缓冲区里的增量命令会以 AOF 方式写入到 AOF 文件
- 写入完成后通知主进程将新的含有 RDB 格式和 AOF 格式的 AOF 文件替换旧的的 AOF 文件。
总结:AOF 文件的前半部分是 RDB 格式的全量数据,后半部分是 AOF 格式的增量数据。

相关文章:
【Redis】——RDB快照
Redis 是内存数据库,但是它为数据的持久化提供了两个技术,一个是AOF日志,另一个是RDB快照: AOF 文件的内容是操作命令;RDB 文件的内容是二进制数据。 RDB 快照就是记录某一个瞬间的内存数据,记录的是实际…...
微服务监控技术skywalking的部署与使用(亲测无坑)
微服务监控技术skywalking的部署与使用 1. 前期准备2. skywalking安装部署2.1 Java Agent2.2 apache/skywalking-oap-server2.3 apache/skywalking-ui 3. 项目启动4.效果展示 1. 前期准备 注:本篇文章采用docker部署,采用8.2.0版本,版本一定…...
DLA 神经网络的极限训练方法:gradient checkpointing
gradient checkpointing 一般来说,训练的过程需要保存中间结果(不管是GPU还是CPU)。前向传播根据输入(bottom_data)计算输出(top_data),后向传播由top_diff计算bottom_diff(如果某个变量打开梯度进行训练的话ÿ…...
python excel 操作
excel文件内容如下: 一、xlrd 读Excel 操作 1、打开Excel文件读取数据 filexlrd.open_workbook(filename)#文件名以及路径,如果路径或者文件名有中文给前面加一个 r 2、常用函数 (1)获取一个sheet工作表 table file.sheets(…...
记一次Linux启动Mysql异常解决
文章目录 第一步: netstat -ntlp 查看端口情况2、启动Mysql3、查看MySQL日志 tail -100f /var/log/mysqld.log4、查看磁盘占用情况:df -h5、思路小结 第一步: netstat -ntlp 查看端口情况 并没有发现3306数据库端口 2、启动Mysql service …...
ATFX汇市:美联储年内或仍将加息依次,美指向下空间不大
环球汇市行情摘要—— 昨日,美元指数上涨0.08%,收盘在102.08点, 欧元贬值0.07%,收盘价1.1003点; 日元贬值0.51%,收盘价142.47点; 英镑升值0.28%,收盘价1.2784点; 瑞…...
【博客687】k8s informer的list-watch机制剖析
k8s informer的list-watch机制剖析 1、list-watch场景: client-go中的reflector模块首先会list apiserver获取某个资源的全量信息,然后根据list到的rv来watch资源的增量信息。希望使用client-go编写的控制器组件在与apiserver发生连接异常时,…...
用Python获取链家二手房房源数据,做可视化图分析数据
前言 数据采集的步骤是固定: 发送请求, 模拟浏览器对于url地址发送请求获取数据, 获取网页数据内容 --> 请求那个链接地址, 返回服务器响应数据解析数据, 提取我们需要的数据内容保存数据, 保存本地文件 所需模块 win R 输入cmd 输入安装命令 pip install 模块名 (如果你…...
Yield Guild Games:社区更新 — 2023 年第二季度
本文重点介绍了 Yield Guild Games (YGG) 2023 年第二季度社区更新中涵盖的关键主题,包括公会发展计划 (GAP) 第 3 季的总结、YGG 领导团队的新成员以及 YGG 的最新消息地区公会网络和广泛的游戏合作伙伴生态系统。 在 YGG 品牌焕然一新的基础上,第二季…...
Stable Diffusion - 运动服 (Gymwear Leggings) 风格服装与背景的 LoRA 配置
欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/132179050 测试模型:DreamShaper 8 运动裤 (Gymwear Leggings) 是紧身的裤子,通常用于健身、瑜伽、跑步等运动。运动裤的…...
js-7:javascript原型、原型链及其特点
1、原型 JavaScript常被描述为一种基于原型的语言-每个对象拥有一个原型对象。 当试图访问一个对象的属性时,它不仅仅在该对象上搜寻,还会搜寻该对象的原型,以及该对象的原型的原型,依次层层向上搜索,直到找到一个名字…...
无涯教程-Perl - continue 语句函数
可以在 while 和 foreach 循环中使用continue语句。 continue - 语法 带有 while 循环的 continue 语句的语法如下- while(condition) {statement(s); } continue {statement(s); } 具有 foreach 循环的 continue 语句的语法如下- foreach $a (listA) {statement(s); } co…...
【贪心算法】leetcode刷题
贪心算法无固定套路。 核心思想:先找局部最优,再扩展到全局最优。 455.分发饼干 两种思路: 1、从大到小。局部最优就是大饼干喂给胃口大的,充分利用饼干尺寸喂饱一个,全局最优就是喂饱尽可能多的小孩。先遍历的胃口&a…...
PyMySQL库版本引起的python执行sql编码错误
前言 长话短说,之前在A主机(centos7.9)上运行的py脚本拿到B主机上(centos7.9)运行报错: UnicodeEncodeError: latin-1 codec cant encode characters in position 265-266: ordinal not in range(256)两个…...
第二章-算法
第二章-算法 数据结构和算法的关系 算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。 算法的特性 算法有五个基本特征:输入、输出、有穷性、确定性和可行性。 输入:算法具…...
‘vue’不是内部或外部命令,也不是可运行的程序或批处理文件的原因及解决方法
今天我在用node.js的时候,结果出现如下错误: C:\Users\xiesj> vue -v vue不是内部或外部命令,也不是可运行的程序或批处理文件。 原因: 1、确定npm是否已正确安装? 2、确定vue以及vue-cli已正确安装?…...
HBase API
我们之后的实际开发中不可能在服务器那边直接使用shell命令一直敲的,一般都是通过API进行操作的。 环境准备 新建Maven项目,导入Maven依赖 <dependencies><dependency><groupId>org.apache.hbase</groupId><artifactId>…...
Qt6之QListWidget——Qt仿ToDesk侧边栏(1)
一、 QLitWidget概述 注意:本文不是简单翻译Qt文档或者接口函数,而侧重于无代码Qt设计器下演示使用。 QListWidget也称列表框类,它提供了一个类似于QListView提供的列表视图,但是它具有一个用于添加和删除项的经典的基于项的接口…...
Prometheus技术文档--基本安装-docker安装并挂载数据卷-《十分钟搭建》
一、查看可安装的版本 docker search prom/prometheus 二、拉取镜像 docker pull prom/prometheus 三、查看镜像 docker images 四、书写配置文件-以及创建挂载目录 宿主机挂载目录位置: 以及准备对应的挂载目录: /usr/local/docker/promethues/se…...
Android 数据库之GreenDAO
GreenDAO 是一款开源的面向 Android 的轻便、快捷的 ORM 框架,将 Java 对象映射到 SQLite 数据库中,我们操作数据库的时候,不再需要编写复杂的 SQL语句, 在性能方面,greenDAO 针对 Android 进行了高度优化,…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...
安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...
使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...
