说说RDB和AOF

简介:

众所周知,redis是一个内存数据库,当机器重启后,内存中数据都会丢失。所以redis提供了两种持久化方式,即:RDB(保存一个时间点前的数据)和AOF(保存redis服务器端执行的每一条命令)。

RDB:

RDB有两种触发方式,

  1. 其一为通过配置参数,例如在配置文件中写入如下配置:
    save 60 1000
    表示在60秒内有1000个key发生变化,就会触发一次RDB快照执行。
  2. 通过客户端执行bgsave命令显示触发一次RDB快照,流程图如下:

RDB文件结构

由于RDB的键值保存形式不同,我们先对其文件结构进行介绍:

 

  1. 固定字符串字段
  2. RDB版本号
  3. 辅助字段(使用每段前 opcodes来分辨是否为辅助字段),可包含:
    1. 数据库号
    2. 当前数据库键值对散列表大小(加载时直接扩散到指定大小,加快速度)
    3. 当前数据库过期时间散列表大小
    4. Redis 具体键值对存储
    5. RDB文件结束标志
    6. 8字节校验码

键的保存形式

Redis中键都是字符串形式,所以存储方式如下:

LENGTH使用8字节保存了字符串长度。

值的保存形式

  1. 列表保存:列表类型在Redis中为quicklist(双向链表连接起来的ZipList)结构,从整体来看是一个双向链表
  2. 集合类型保存:集合类型在Redis有两种保存形式:intset,Hash。
    1. intset直接将intset按字符串保存,
    2. Hash则如下所示:
  3. 有序集合类型的保存:ziplist,skiplist。
    1. ziplist直接将其整体作为一个字符串保存
    2. skiplist则如下:
  4. 散列类型保存:ziplist,Hash。
    1. ziplist直接将其整体作为一个字符串保存
    2. Hash则如下:

AOF:

将Redis服务端执行过的每一条命令都保存到一个文件,这样当Redis重启时只要按顺序回访这些命令就会恢复到原始状态。

为什么有了RDB还需要AOF呢?

因为,RDB是一个时间点的快照,那么如果Redis发生故障,丢失的就是最后一次RDB开始到发生故障节点之间的数据,如果RDB数据越大,丢失越多。

综合来讲,RDB保存的是最终的数据,而AOF保存的是达到这个最终数据的状态。而且在加载过程中,RDB只需要把相应数据加载到内存并生成相应的数据结构,而AOF要创建一个伪客户端,将每条命令发给服务端,服务端在重写数据。

AOF执行流程

由于每条命令执行都要调用一个call函数,AOF就是在call函数里面实现的,流程如下图:

AOF文件写入

AOF持久化最终需要将缓冲区中的内容写入一个文件,写文件通过操作系统提供的write函数执行。但write之后的数据只是保存在kernel缓冲区中,真正写入磁盘还需要调用fsync函数。

AOF重写

由于需要控制AOF文件大小,所以出现相同命令会保留最终效果,举例说明:

比如我使用命令入下

set n1 a
set n1 b

最终aof留存的是 ("n1", "b")这个键值对.

AOF重写通过fork出一个子进程来执行,重写不会对原有文件进行任何修改和读取,子进程对所有数据库中所有的键各自生成一条相应的执行命令,最后将重写开始后父进程继续执行的命令进行回放,生成一个新的AOF文件

AOF重写触发方式:

  1. 修改配置
    auto-aof-rewrite-percentage 64mb

  2. 手动执行 bgrewriteaof 执行流程入下

先在父进程中将重写命令进行保存,然后再将这些命令再重写后的文件中进行回放

混合持久化

进行AOF重写时,子进程将当前时间点的数据块照保存为RDB文件格式,而后将父进程累积命令保存为AOF格式。

加载时会先判断是否以"REDIS"开头,即是否以RDB格式开头,是则按RDB格式加载,直到加载到AOF格式采用AOF加载

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

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

相关文章

【算法与数据结构】300、674、LeetCode最长递增子序列 最长连续递增序列

文章目录 一、300、最长递增子序列二、674、最长连续递增序列三、完整代码 所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。 一、300、最长递增子序列 思路分析: 第一步,动态数组的含义。 d p [ i ] dp[i] dp[i…

程序执行内存区域,堆栈使用及区别

文章目录 一、程序执行内存区域二、堆区详解三、栈内存与堆内存的区别总结 一、程序执行内存区域 **代码区:**当我们的程序被执行时,它会有一个加载准备的过程。其中函数及内部的流程结构代码指令会被放到代码区中,等待着被调用执行。 **常数…

【JS】基于React的Next.js环境配置与示例

😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍基于React的Next.js环境配置与示例。 学其所用,用其所学。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下,下…

【乳腺肿瘤诊断分类及预测】基于自适应SPREAD-PNN概率神经网络

课题名称:基于自适应SPREAD-PNN的乳腺肿瘤诊断分类及预测 版本日期:2023-06-15 运行方式: 直接运行PNN0501.m 文件即可 代码获取方式:私信博主或QQ:491052175 模型描述: 威斯康辛大学医学院经过多年的收集和整理&…

笔记---求组合数

总&#xff1a; ①10w次询问——1 < b < a < 2000——递推求—— N N N2 ②1w次询问——1 < b < a < 105——公式求—— N l o g N NlogN NlogN ③20次询问——1 < b < a < 1018——Lucas定理 ④1次询问——1 < b < a < 5000——拆分质因子…

【数据结构与算法】(7)基础数据结构之双端队列的链表实现、环形数组实现示例讲解

目录 2.6 双端队列1) 概述2) 链表实现3) 数组实现习题E01. 二叉树 Z 字层序遍历-Leetcode 103 2.6 双端队列 1) 概述 双端队列、队列、栈对比 定义特点队列一端删除&#xff08;头&#xff09;另一端添加&#xff08;尾&#xff09;First In First Out栈一端删除和添加&…

普渡机器人CEO预测2024年服务机器人市场将扩大

原创 | 文 BFT机器人 根据普渡科技有限公司的报告&#xff0c;商用服务机器人在东亚地区的应用比其他地方更为广泛。然而&#xff0c;预计到2024年&#xff0c;全球其他地区也将迎头赶上。这家总部位于中国深圳的公司自豪地宣称&#xff0c;它已经成为中国最大的此类机器人出口…

基于微信小程序的书籍阅读系统,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

【Unity知识点详解】自定义程序集

今天来介绍一下Unity中的自定义程序集。在项目开发中我们经常接触到第三方插件的程序集&#xff0c;如DOTween、Newtonsoft.Json等。 使用自定义程序集有这么几个好处&#xff1a; 方便代码的的复用。当某一功能模块需要在多个项目中重复使用时&#xff0c;可以将代码编译成程…

Linux 驱动开发基础知识——内核对设备树的处理与使用(十)

个人名片&#xff1a; &#x1f981;作者简介&#xff1a;学生 &#x1f42f;个人主页&#xff1a;妄北y &#x1f427;个人QQ&#xff1a;2061314755 &#x1f43b;个人邮箱&#xff1a;2061314755qq.com &#x1f989;个人WeChat&#xff1a;Vir2021GKBS &#x1f43c;本文由…

【数据结构与算法】(5)基础数据结构之队列 链表实现、环形数组实现详细代码示例讲解

目录 2.4 队列1) 概述2) 链表实现3) 环形数组实现 2.4 队列 1) 概述 计算机科学中&#xff0c;queue 是以顺序的方式维护的一组数据集合&#xff0c;在一端添加数据&#xff0c;从另一端移除数据。习惯来说&#xff0c;添加的一端称为尾&#xff0c;移除的一端称为头&#xf…

安装配置Oracle 11g 、PLSQL及使用Navicat远程连接Oracle

目录 一、下载 二、安装 1.执行安装程序 2.配置安全更新 3.安装选项 4.系统类 5.网络安装选项 6.选择安装类型 7.选择产品语言 8.选择数据库版本 9.指定安装位置 10.选择配置类型 ​编辑11.指定数据库标识符 12.指定配置选项 13.电子邮箱 14.指定数据库存储…

自学Java的第十九天

一&#xff0c;每日收获 1.排序 2.冒泡排序法 3.查找 4.多维数组-二维数组 二&#xff0c;新名词与小技巧 三&#xff0c;今天学习中所遇到的困难 一&#xff0c;每日收获 1.排序 ① 排序的介绍 排序是将多个数据&#xff0c;依指定的顺序进行排列的过程。 ② 排序的…

学习c语言,动态内存管理

malloc和calloc区别在于初始化 realloc动态内存

【从单张图像解锁深度信息】Depth Anything一种用于鲁棒单目深度估计的高度实用的解决方案

Depth Anything是一种用于鲁棒单目深度估计的高度实用的解决方案。 在不追求新颖的技术模块的情况下,我们的目标是建立一个简单而强大的基础模型,处理任何情况下的任何图像。 为此,我们通过设计数据引擎来收集并自动注释大规模未标记数据(~62M)来扩展数据集,这显着扩大了…

web前端-------弹性盒子(2)

上一讲我们谈的是盒子的容器实行&#xff0c;今天我们来聊一聊弹性盒子的项目属性&#xff1b; *******************&#xff08;1&#xff09;顺序属性 order属性&#xff0c;用于定义容器中项目的出现顺序。 顺序属性值&#xff0c;为整数&#xff0c;可以为负数&#xff…

Elasticsearch:集群故障排除和优化综合指南

Elasticsearch 是一个强大的搜索和分析引擎&#xff0c;是许多数据驱动应用程序和服务的核心。 它实时处理、分析和存储大量数据的能力使其成为当今快节奏的数字世界中不可或缺的工具。 然而&#xff0c;与任何复杂的系统一样&#xff0c;Elasticsearch 可能会遇到影响其性能和…

Container 命令ctr、crictl 命令

1、 Containerd和Docker的架构区别 Docker vs. Containerd&#xff1a; 2、ctr & crictl的区别 ctr是containerd的一个客户端工具 crictl 是 CRI 兼容的容器运行时命令行接口&#xff0c;可以使用它来检查和调试 Kubernetes 节点上的容器运行时和应用程序 crictl 则直接对…

Maxwell查询databases表报错:You have an error in your SQL syntax;

报错信息&#xff1a;You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near databases at line 1 报错说明&#xff1a; maxwell初始化后&#xff0c;在其数据库中会有一些表&#xff0c;…

pdf高亮显示

现在前端pdf需求越来越多&#xff0c;比如发票的显示&#xff0c;文件的显示&#xff0c;怎么实现具体步骤百度一下吧&#xff0c;这里不做详细介绍&#xff0c;主要记录下遇到的问题 1.页面pdf已经看到了&#xff0c;但是 iframe.contentWindow.PDFViewerApplication显示unde…