Redis RDB三两事

rdb:将数据库的快照以二进制格式保存在文件中,redis重启后直接加载数据。可以通过save和bgsave命令生成rdb。当然我们可以在生成rdb文件时指定规则,例如
save 60 1000
如果60秒内不少于1000个key发生了改动,则生成一个新的rdb文件。
- RDB定时逻辑
- 若当前程序存在子进程,则检查是否有子进程已执行完成,如果有,则执行对应的父进程进行收尾工作
- 检查服务器自从上一次生成RDB后,redis服务器变更了多少个健,若满足以下条件则开始生成RDB文件:
- 满足设定的RDB生成配置
- 上一次RDB成功生成已过去CONFIG_BGSAVE_RETRY_DELAY(5秒)
- RDB持久化进程
-
fork子进程(bgsave命令创建子进程,save命令则是调用主进程,因此会造成阻塞)
子进程会“复制”父进程的用户空间作为自己的用户空间,所以子进程和父进程都有自己独立的进程空间(同时会共享部分数据)。fork函数调用一次,会分别在父进程和子进程两处返回。
- 创建RDB进程
- 尽可能将RDB进程绑定到用户配置的CPU列表bgsave_cpulist上,减少不必要的进程切换,最大程度提高性能。
- 生成RDB文件
- 打开一个临时文件用于保存数据
- 初始化负责读/写文件的函数
- 赋值fsync
- 将redis数据库的内容写到临时文件中
- 重新命名临时文件,替换旧的RDB文件
- 更新server相关的RDB属性
- 写入RDB数据
- 往文件中写入一个RDB标志,标志该文件是RDB文件
- 写入辅助字段,如版本号、创建时间……
- 将数据字典以外的数据保存到RDB中
- 遍历所有的数据库
- 写入RDB_OPCODE_SELECTDB标志和数据库ID
- 写入RDB_OPCODE_RESIZEDB标志和数据库字典大小、过期字典大小
- 遍历数据库的键值对,将键值对和过期时间写入RDB中
- 若是过期时间则写入过期标志和过期时间戳
- 若是LRU或LFU则记录空闲时间或LFU计数
- 写入键值对标志,再写健内容再写值内容
- 将redis中的lua脚本写入RDB文件
- 写入结束标志
- 写入校验码
- 退出RDB进程
- 更新server的运行时数据
-
父进程收尾
- 检查是否存在已结束的子进程
- 获取子进程的结束代码和中断信号,根据这些标志做不同的逻辑处理
- 如果子进程是RDB进程,RDB数据保存成功后,需将RDB文件发送给正在同步的从服务器
-
RDB文件加载过程
- 读取RDB文件里的RDB标志
- 分析RDB文件。首先读取字节码,再根据标志字节进行相应的处理。
- 读取键值对,转换为redisObject
- 如果读取到健已过期,且当前服务器是主节点,则删除该健
- 将读取的键值对加入数据字典中
- 若redis版本大于5还需检查校验码
-
相关文章:
Redis RDB三两事
rdb:将数据库的快照以二进制格式保存在文件中,redis重启后直接加载数据。可以通过save和bgsave命令生成rdb。当然我们可以在生成rdb文件时指定规则,例如 save 60 1000 如果60秒内不少于1000个key发生了改动,则生成一个新的rdb文件…...
分布式高可用架构设计
一、限流 1、单机限流 如图,应用C的资源c/x被上游的应用A和应用C并发访问,应用C的系统能力支持c/x资源最高5000/qps的访问量;为了不让高并发流量或尖峰流量压垮应用C,可以针对应用C的资源c/x做限流;比如设置限流4500…...
GATK SampleList接口介绍
在 GATK 中,SampleList 是一个接口,用于表示一个样本列表。这些样本通常是在基因组分析过程中被处理的不同生物样本。SampleList 接口提供了访问这些样本的一些基本方法,通常用于多样本分析任务,比如变异检测或基因组重测序。 SampleList 接口的方法 SampleList 接口定义…...
00后是真卷不过,工作没两年,跳槽到我们公司起薪20K都快接近我了
在程序员职场上,什么样的人最让人反感呢? 是技术不好的人吗?并不是。技术不好的同事,我们可以帮他。 是技术太强的人吗?也不是。技术很强的同事,可遇不可求,向他学习还来不及呢。 真正让人反感的,是技术平平&…...
树莓派Pico C/C++ 开发环境搭建(一键完成版)
树莓派Pico C/C 开发环境搭建(一键完成版) 因为之前使用过MicroPython开发过树莓派Pico,总觉得用起来怪怪的。正好最近树莓怕发布了新一代的MCU——RP2350,之前的RP2040在各个平台都有所降价,因此,买了几块。同时因为之前是玩stm…...
【计算机组成原理】二、数据的表示和运算:1.数值与编码(十进制二进制转换、BCD码、ASCII码、汉字编码、奇偶校验码、循环冗余检测CRC、海明码)
二、数据的表示和运算 文章目录 二、数据的表示和运算1.数值与编码1.1数据存储和排列❗1.2十进制转换1.2.1整数1.2.2小数 1.3二进制转换1.3.1 B->O1.3.2 B->H 1.4真值&机器数1.5 BCD码1.6 ASCII码1.7汉字与GBK1.8 UTF1.9检错码1.9.1奇偶校验码1.9.2循环冗余检测CRC1.…...
汇编语言中的艺术:数据压缩与解压缩技术
标题:汇编语言中的艺术:数据压缩与解压缩技术 数据压缩是计算机科学中的一项基本技术,它通过减少数据的冗余来降低存储或传输所需的空间。在低级语言如汇编语言中实现数据压缩和解压缩,不仅是一种技术挑战,也是对硬件…...
【Alibaba Cola 状态机】重点解析以及实践案例
【Alibaba Cola 状态机】重点解析以及实践案例 1. 状态模式 状态模式是一种行为型设计模式,允许对象在内部状态改变时改变其行为,简单地讲就是,一个拥有状态的context对象,在不同状态下,其行为会发生改变。看起来是改…...
购买商城源码前需要考虑哪些方面?
前言 购买商城源码前需要考虑的方面包括功能满足、技术兼容性、可扩展性、公司实力、客户评价、安全性与稳定性等。 购买商城源码是一项重要决策,需要综合考虑多个因素。以下是详细的考虑方面: 1.功能满足: 确保所选的源码能够支持企业所…...
MongoDB快速入门CRUD
1. 数据库管理 1.1 切换数据库 切换到名为 myDatabase 的数据库。如果该数据库不存在,MongoDB 会在第一次写入数据时自动创建它。 use myDatabase;1.2 查看当前数据库 显示当前使用的数据库的名称。 db; 1.3 显示所有数据库 列出当前 MongoDB 实例中的所有数…...
【python基础】—利用pandas读取或写入mysql表数据
文章目录 一、read_sql()二、to_sql()三、连接数据库方式—MySQL1、用sqlalchemy包构建数据库链接2、用DBAPI构建数据库链接 四、容易遇到的问题 一、read_sql() 功能 将 SQL 查询/数据库表读入 DataFrame。 语法 读取数据库(通过SQL语句或表名) pand…...
C/C++信号量
文章目录 一、信号量介绍1.1 什么是信号量1.2 信号量的原子性1.3 信号量的使用 二、C语言使用2.1 函数接口2.2 信号量代码 三、C20使用3.1 函数接口 四、C11模拟信号量 一、信号量介绍 1.1 什么是信号量 信号量是一种特殊的变量,是操作系统层面的,可以…...
SSL Pining 问题解决方案
实战案例 为了能够更好的复现 SSL Pining 场景,我们对一个 App(https:app4.scrape.center)进行抓包,这个 App 包含了 SSL Pining 的相关设置,如果我们将手机的代理设置为抓包软件提供的代理服务,那么这个 …...
【Spring Boot】全局异常处理
目录 背景 前言 设计步骤 1.定义异常信息类: 2.自定义异常: 3.创建全局异常处理类 4.在控制器中抛出异常 5.输出 捕获 Valid 校验异常 背景 去面试的时候被问到SpringBoot项目中,如何处理全局异常的,也就是如何捕获全局异…...
安全基础学习-SM3加密算法
SM3是一种广泛使用在中国国家标准中的哈希算法,全称为“中国国家密码算法SM3”。它由中国国家密码管理局制定,主要用于数字签名和消息完整性验证。SM3算法与SHA-256在结构上类似,但其设计具有特定的改进以增强安全性。 SM3算法生成256位的哈希值,使用了32轮的迭代运算,并…...
MySQL中处理JSON数据:大数据分析的新方向
1. 简介 1.1. 概述 在MySQL中处理JSON数据的能力是在MySQL 5.7版本中引入的,并在后续的版本中不断得到增强。这使得MySQL能够直接操作和查询JSON格式的数据,极大地扩展了其处理复杂数据结构的能力。 1.2. 主要特点 灵活性与可扩展性 :JSON允许开发者存储不规则和嵌套的数…...
K8S 容器调度
在Kubernetes中,容器调度是一个自动化的过程,负责将容器(在Kubernetes中称为Pod)分配到集群中的合适节点上运行。这一过程由Kubernetes的调度器(kube-scheduler)控制,它通过一系列算法和策略来确…...
C++ //练习 17.2 定义一个tuple,保存一个string、一个vector<string>和一个pair<string, int>。
C Primer(第5版) 练习 17.2 练习 17.2 定义一个tuple,保存一个string、一个vector和一个pair<string, int>。 环境:Linux Ubuntu(云服务器) 工具:vim 代码块 /**********************…...
外观检测设备真的能提高生产效率吗?
零部件外观检测设备是一种专业的设备,用于对各类零部件的外观进行检测和评估。现代制造业中扮演着重要的角色,能够有效提升产品质量,确保产品符合国家标准和客户需求。 首先,零部件外观检测设备具备高精度和高效率的特点。通过采用…...
ant design pro 中用户的表单如何控制多个角色
ant design pro 如何去保存颜色ant design pro v6 如何做好角色管理ant design 的 tree 如何作为角色中的权限选择之一ant design 的 tree 如何作为角色中的权限选择之二ant design pro access.ts 是如何控制多角色的权限的 看上面的图片 当创建或编辑一个用户时,…...
AGV如何实现自主避障
下面按“传感器→建模→算法→安全机制→工程实现”的顺序,把AGV自主避障讲清楚。 一、整体架构概览 AGV要“自己绕开障碍”,至少要做三件事: 1)感知:知道“我在哪”“周围有什么”; 2)规划&…...
依赖p4est库的程序windows运行方法----支持vs2022调试
一.前置环境 1.vs2022且包含CLangCL工具集,没有安的在vs的intaller里边修改已安装的vs2022,在右侧目录里勾选上(使用c进行桌面开发/适用于windows的CClang工具)。 2.安装MS-MPI,安在默认位置即可(https://www.micros…...
GD32F407标准库工程创建全流程:从官网固件库下载到Keil5编译通过
GD32F407标准库工程创建全流程:从官网固件库下载到Keil5编译通过 第一次接触GD32F407开发板时,最让人头疼的就是如何快速搭建开发环境。与STM32不同,GD32的官方资源分散,标准库文件结构复杂,新手很容易在文件复制和工程…...
CherryStudio+Obsidian联动指南:如何让本地笔记成为大模型的长期记忆?
CherryStudio与Obsidian深度整合:构建AI可理解的长期记忆系统 在信息爆炸的时代,我们每天都在产生大量笔记和知识片段,但这些内容往往沉睡在本地文件中,无法与智能工具形成有效互动。Obsidian以其独特的网状笔记结构和本地Markdow…...
元宇宙遗产:那些永远无法测试的AR社交漏洞
测试的疆界与永恒的盲区在软件测试领域,我们习惯于与已知作战。我们制定详尽的测试用例,模拟用户行为,构建自动化脚本,利用AI生成攻击向量,力求覆盖每一个可预见的边界和异常。漏洞扫描、渗透测试、模糊测试、代码审查…...
不用Root!教你用ADB命令手动安装Google TTS中文语音包
免Root实现Google TTS中文语音引擎的完整部署指南 你是否遇到过在国产定制Android系统上无法使用Google文字转语音功能的困扰?许多厂商预装的语音引擎发音生硬,而Google TTS的中文语音包又常常因为系统限制无法正常安装。本文将带你绕过这些限制…...
蛋白质功能预测:从序列同源性到多模态深度学习
点击 “AladdinEdu,你的AI学习实践工作坊”,注册即送-H卡级别算力,沉浸式云原生集成开发环境,80G大显存多卡并行,按量弹性计费,教育用户更享超低价。 摘要:蛋白质功能预测是注释未知蛋白质、揭示…...
mPLUG-Owl3-2B多模态推理优化教程:FP16加载+SDPA注意力提速实测
mPLUG-Owl3-2B多模态推理优化教程:FP16加载SDPA注意力提速实测 1. 开篇:为什么需要优化多模态推理? 如果你尝试过在个人电脑上运行多模态AI模型,很可能遇到过这些问题:显存不足导致程序崩溃、推理速度慢得让人着急、…...
别再死记硬背了!用‘减法’和‘host/any’关键字,5分钟搞定思科ACL通配符掩码配置
思科ACL通配符掩码:5分钟掌握减法计算与host/any实战技巧 刚接触思科ACL配置时,通配符掩码总是让人头疼。那些0和1的组合看似简单,实际配置时却容易出错。但你可能不知道,掌握两个核心技巧就能彻底解决这个问题——用255.255.255.…...
告别写死地址!CH32V IAP升级实战:用函数传参实现APP跳转地址的动态配置
CH32V IAP升级进阶:动态跳转地址的工程实践与安全设计 在嵌入式开发中,IAP(In-Application Programming)技术是实现固件远程更新的重要手段。对于CH32V系列RISC-V MCU而言,官方示例中"写死"跳转地址的做法虽…...
