Redis RDB三两事

在这里插入图片描述
rdb:将数据库的快照以二进制格式保存在文件中,redis重启后直接加载数据。可以通过savebgsave命令生成rdb。当然我们可以在生成rdb文件时指定规则,例如

save 60 1000
如果60秒内不少于1000个key发生了改动,则生成一个新的rdb文件。
  1. RDB定时逻辑
    1. 若当前程序存在子进程,则检查是否有子进程已执行完成,如果有,则执行对应的父进程进行收尾工作
    2. 检查服务器自从上一次生成RDB后,redis服务器变更了多少个健,若满足以下条件则开始生成RDB文件:
      1. 满足设定的RDB生成配置
      2. 上一次RDB成功生成已过去CONFIG_BGSAVE_RETRY_DELAY(5秒)
  2. RDB持久化进程
    1. fork子进程(bgsave命令创建子进程,save命令则是调用主进程,因此会造成阻塞)

      子进程会“复制”父进程的用户空间作为自己的用户空间,所以子进程和父进程都有自己独立的进程空间(同时会共享部分数据)。fork函数调用一次,会分别在父进程和子进程两处返回。

      1. 创建RDB进程
      2. 尽可能将RDB进程绑定到用户配置的CPU列表bgsave_cpulist上,减少不必要的进程切换,最大程度提高性能。
      3. 生成RDB文件
        1. 打开一个临时文件用于保存数据
        2. 初始化负责读/写文件的函数
        3. 赋值fsync
        4. 将redis数据库的内容写到临时文件中
        5. 重新命名临时文件,替换旧的RDB文件
        6. 更新server相关的RDB属性
      4. 写入RDB数据
        1. 往文件中写入一个RDB标志,标志该文件是RDB文件
        2. 写入辅助字段,如版本号、创建时间……
        3. 将数据字典以外的数据保存到RDB中
        4. 遍历所有的数据库
        5. 写入RDB_OPCODE_SELECTDB标志和数据库ID
        6. 写入RDB_OPCODE_RESIZEDB标志和数据库字典大小、过期字典大小
        7. 遍历数据库的键值对,将键值对和过期时间写入RDB中
          1. 若是过期时间则写入过期标志和过期时间戳
          2. 若是LRU或LFU则记录空闲时间或LFU计数
          3. 写入键值对标志,再写健内容再写值内容
        8. 将redis中的lua脚本写入RDB文件
        9. 写入结束标志
        10. 写入校验码
      5. 退出RDB进程
      6. 更新server的运行时数据
    2. 父进程收尾

      1. 检查是否存在已结束的子进程
      2. 获取子进程的结束代码和中断信号,根据这些标志做不同的逻辑处理
      3. 如果子进程是RDB进程,RDB数据保存成功后,需将RDB文件发送给正在同步的从服务器
    3. RDB文件加载过程

      1. 读取RDB文件里的RDB标志
      2. 分析RDB文件。首先读取字节码,再根据标志字节进行相应的处理。
      3. 读取键值对,转换为redisObject
      4. 如果读取到健已过期,且当前服务器是主节点,则删除该健
      5. 将读取的键值对加入数据字典中
      6. 若redis版本大于5还需检查校验码

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

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

相关文章

如何在C++ QT 程序中集成cef3开源浏览器组件去显示网页?

目录 1、问题描述 2、为什么选择cef3浏览器组件 3、cef3组件的介绍与下载 4、将cef3组件封装成sdk 5、如何使用cef3组件加载web页面 5.1、了解CefApp与CefClient 5.2、初始化与消息循环 5.3、如何创建浏览器 5.4、重载CefClient类 6、在qt客户端集成cef组件 7、最后…

什么是主机加固?主机加固的几种有效方法

在数字化时代,数据的价值不言而喻,但随之而来的安全威胁也日益严峻。从勒索病毒到内部泄露,企业的数据安全面临着前所未有的挑战。为了应对这些挑战,一种全新的主机加固解决方案应运而生。 MCK主机加固解决方案,采用先…

Using Azure openAI key rotation automation

题意:使用 Azure OpenAI 密钥轮换自动化 问题背景: We are planning to do the Azure OpenAI key rotation automatically. How can we achieve this? Do we have terraform resource for this. 我们计划自动执行 Azure OpenAI 密钥轮换。我们如何实现…

运维小技能:通过调整JVM的默认内存配置来解决内存溢出(‌OutOfMemoryError)‌或栈溢出(‌StackOverflowError)‌等错误

文章目录 引言I 调整JVM的默认堆内存配置1.1 java命令启动jar包时配置JVM 的内存参数1.2 基于Tomcat服务器部署的java应用,配置JVM 的内存参数II 案例: Linux 操作系统设置tomcat的 JVM 的内存参数查找Tomcat位置: 快速定位服务状态和部署位置具体配置步骤扩展: 监测Nginx访…

Mysql查询日志

Mysql查询日志 Mysql查询日志默认是关闭状态的。 mysql> show variables like %general_log%; --------------------------------------- | Variable_name | Value | --------------------------------------- | general_log | OFF …

Python数分实战

学习视频:【课程3.0】Python基础与分析实战_哔哩哔哩_bilibili 由于学习过python进行数据分析,所以就简单记录一下,最主要学习的还是视频最后的两个项目,进行实战 之前想不明白明明有很智能的软件做数据分析,为什么还要…

C++票据查验、票据ocr、文字识别

现在,80、90后的人们逐渐过渡为职场上的主力人员,在工作中当然也会碰到各种各样的问题。比如,当你的老板给你一个艰难的任务时,肯定是不能直接拒绝的。那么我们该怎么做呢?翔云建议您先认真考虑老板说的任务的难度&…

倍福ADS通信教程

介绍 TwinCAT3 TwinCAT3是Beckhoff推出的一款基于PC的控制器软件,简单理解是一套集成开发环境,里边有各种分析工具以及通信中间件;开发者可以很方便的用它来进行IPC和PLC之间的通信连接 ADS 倍福ADS(‌Automation Device Spec…

WebRTC音视频开发读书笔记(六)

数据通道不仅可以发送文本消息, 还可以发送图片、二进制文件,将其类型binaryType属性设置成arraybuffer类型即可. 九\、文件传输 1、文件传输流程 (1)使用表单file打开本地文件 (2)使用FileReader读取文件的二进制数据 &#…

零基础学习Redis(5) -- redis单线程模型介绍

前面我们提到过,redis是单线程的,这期我们详细介绍一下redis的单线程模型 1. redis单线程模型 redis只使用一个线程处理所有的请求,并不是redis服务器进程内部只有一个线程,其实也存在多个线程,只不过多个线程是在处…

SparkSQL遵循ANSI标准

ANSI简介 ANSI Compliance通常指的是遵循美国国家标准学会(American National Standards Institute, ANSI)制定的标准。在计算机科学和技术领域,这通常涉及到数据库管理系统(DBMS)对于SQL语言的支持程度。 ANSI为SQL…

基于vue框架的爱学习分享平台ud317(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能:用户,学科分类,交流答疑,论坛交流,学习资料 开题报告内容 基于Vue框架的爱学习分享平台 开题报告 一、项目背景与意义 随着互联网技术的飞速发展,知识的获取与传播方式正经历着前所未有的变革。在线教育平台逐渐成为满足…

如何理解:进程控制

文章目录 前言:进程创建:进程终止:如何终止进程?进程等待非阻塞等待: 总结: 前言: ​ 对于前面的地址空间的学习,我们现在了解到原来所谓变量的地址其实是虚拟地址,该虚…

【数学建模备赛】Ep05:斯皮尔曼spearman相关系数

文章目录 一、前言🚀🚀🚀二、斯皮尔曼spearman相关系数:☀️☀️☀️1. 回顾皮尔逊相关系数2. 斯皮尔曼spearman相关系数3. 斯皮尔曼相关系数公式4. 另外一种斯皮尔曼相关系数定义5. matlab的用法5. matlab的用法 三、对斯皮尔曼相…

MySQL(二)——CRUD

文章目录 CRUD新增全列插入指定列插入插入查询结果 查询全列查询指定列查询查询字段为表达式表达式不包含字段表达式包含一个字段表达式包含多个字段 补充:别名去重查询排序条件查询 补充:运算符区间查询模糊查询NULL的查询 分页查询聚合查询聚合函数 分…

C++实现——红黑树

目录 1.红黑树 1.1红黑树的概念 1.2红黑树的性质 1.3红黑树节点的定义 1.4红黑树的插入操作 1.5红黑树的验证 1.6红黑树的删除 1.7红黑树与AVL树的比较 1.8红黑树的应用 1.红黑树 1.1红黑树的概念 红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位…

Chat App 项目之解析(二)

Chat App 项目介绍与解析(一)-CSDN博客文章浏览阅读76次。Chat App 是一个实时聊天应用程序,旨在为用户提供一个简单、直观的聊天平台。该应用程序不仅支持普通用户的注册和登录,还提供了管理员登录功能,以便管理员可以…

初识指针4の学习笔记

目录 1>>前言 2>>字符指针变量 3>>数组指针变量 4>>函数指针变量 5>>函数指针数组 6>>回调函数是什么? 7>>结语 1>>前言 今天我会继续分享一些我做的笔记,以及我对指针的理解, 后续会…

Vue状态管理工具:vuex

目录 基本概念 使用步骤 核心概念 1.State 2.Getters 3.Mutations 4.Actions 5.Modules 辅助函数 基本概念 基础用法 基本概念 官方:Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式 库。它采用集中式存储管理应用的所有组件的状态,并以…

Android全面解析之context机制(三): 从源码角度分析context创建流程(下)

前言 前面已经讲了什么是context以及从源码角度分析context创建流程(上)。限于篇幅把四大组件中的广播和内容提供器的context获取流程放在了这篇文章。广播和内容提供器并不是context家族里的一员,所以他们本身并不是context,因而…