当前位置: 首页 > news >正文

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.lryc.cn/news/428448.html

相关文章:

  • 分布式高可用架构设计
  • GATK SampleList接口介绍
  • 00后是真卷不过,工作没两年,跳槽到我们公司起薪20K都快接近我了
  • 树莓派Pico C/C++ 开发环境搭建(一键完成版)
  • 【计算机组成原理】二、数据的表示和运算:1.数值与编码(十进制二进制转换、BCD码、ASCII码、汉字编码、奇偶校验码、循环冗余检测CRC、海明码)
  • 汇编语言中的艺术:数据压缩与解压缩技术
  • 【Alibaba Cola 状态机】重点解析以及实践案例
  • 购买商城源码前需要考虑哪些方面?
  • MongoDB快速入门CRUD
  • 【python基础】—利用pandas读取或写入mysql表数据
  • C/C++信号量
  • SSL Pining 问题解决方案
  • 【Spring Boot】全局异常处理
  • 安全基础学习-SM3加密算法
  • MySQL中处理JSON数据:大数据分析的新方向
  • K8S 容器调度
  • C++ //练习 17.2 定义一个tuple,保存一个string、一个vector<string>和一个pair<string, int>。
  • 外观检测设备真的能提高生产效率吗?
  • ant design pro 中用户的表单如何控制多个角色
  • Prometheus监控系统
  • mq-fanout交换机
  • android13禁用打开wifi ap 热点
  • 前端宝典之六:React源码解析之lane模型
  • 邦德咖啡线下门店盛大开业,引领国产健康咖啡新风尚
  • Elasticsearch + Search UI 构建一个文件搜索引擎
  • 机械学习—零基础学习日志(如何理解概率论2)
  • 鸿蒙关于手机全局本地文件读取,写入
  • 嵌入式企业面试真题
  • 开源一款H5自适应留言表白墙php源码下载
  • jmeter引入jar包的三种方式