说说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.hqwc.cn/news/448871.html

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

相关文章

Web实战丨基于django+hitcount的网页计数器

文章目录 写在前面Django简介主要程序运行结果系列文章写在后面 写在前面 本期内容 基于djangohitcount的网页计数器 所需环境 pythonpycharm或vscodedjango 下载地址 https://download.csdn.net/download/m0_68111267/88795611 Django简介 Django 是一个开源的、基于 …

DES加密原理

DES加密算法综合运用了置换、代替、代数等多种密码技术,具有设计精 巧、实现容易、使用方便等特点。DES加密算法的明文、密文和密钥的分组长度 都是64位,详细的DES加密算法结构如图6-10所示。 图6-10 DES加密算法结构图 DES加密过程如下所示&#xff…

Linux系统漏洞一键检测与修复工具

支持检测及修复漏洞的列表 OpenSSL CVE-2021-3712 OpenSSH CVE-2021-41617 sudo CVE-2021-3156 glibc CVE-2018-11236 polkit CVE-2021-4034 wget CVE-2017-13090 kernel CVE-2016-5195 bash CVE-2016-7543 samba CVE-2021-…

代码随想录第二十四天| 回溯算法● 理论基础 ● 77. 组合

文章目录 理论基础![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/09da30301c104f02baf792ccbf39da15.png)效率回溯法解决的问题如何理解回溯法回溯法模板 77.组合思路:回溯法三部曲 代码:思路-剪枝代码: 理论基础 效率 虽然回…

后端——go系统学习笔记(不断更新中......)

数组 固定大小 初始化 arr1 : [3]int{1, 2, 3} arr2 : [...]int{1, 2, 3} var arr3 []int var arr4 [4]int切片 长度是动态的 初始化 arr[0:3] slice : []int{1,2,3} slice : make([]int, 10)len和cap len是获取切片、数组、字符串的长度——元素的个数cap是获取切片的容量—…

Elasticsearch-内存结构

ElasticSearch的内存从大的结构可以分堆内存(On Heap)和堆外内存(Off Heap)。Off Heap部分由Lucene进行管理。On Heap部分存在可GC部分和不可GC部分,可GC部分通过GC回收垃圾对象,从而释放内存。不可GC部分不…

手机云控制发电机组 有网络随时随地操控监控运行

GenCloudTM 发电机组云控系统简介 Ver2.0 目录 公司简介…… …………………………… ………………………………………………1概 述…… …………………………… ………………………………………………1主要功能及特点………… …………… ………… ………………………………

Halcon C++ 环境与配置

Halcon C 环境与配置 1、环境设置相关 头文件路径添加 D:\MVTec\HALCON-22.11-Steady\include D:\MVTec\HALCON-22.11-Steady\include\halconcpp D:\MVTec\HALCON-22.11-Steady\include\halconclab文件添加 D:\MVTec\HALCON-22.11-Steady\lib\x64-win64link添加路径 D:\MV…

如何避免野指针

大家好,今天给大家介绍如何避免野指针,文章末尾附有分享大家一个资料包,差不多150多G。里面学习内容、面经、项目都比较新也比较全!可进群免费领取。 野指针是一种常见的编程错误,它指的是一个指针被释放后&#xff0c…

Redis核心技术与实战【学习笔记】 - 16.Redis 缓存异常:缓存和数据库不一致

概述 只要使用 Redis 缓存,就必须面对缓存和数据库的一致性问题。 重要的是,如果数据不一致,那么业务应用从缓存中读取的数据就不是最新数据,这会导致严重的问题。比如说,我们把电商商品的库存信息缓存在 Redis 中&am…

6-1 A. DS二叉树—二叉树构建与遍历(不含框架)

题目描述 给定一颗二叉树的逻辑结构如下图,(先序遍历的结果,空树用字符‘#’表示,例如AB#C##D##),建立该二叉树的二叉链式存储结构,并输出该二叉树的先序遍历、中序遍历和后序遍历结果。 输入 第…

【Java开发岗面试】八股文—微服务、消息中间件

声明: 背景:本人为24届双非硕校招生,已经完整经历了一次秋招,拿到了三个offer。本专题旨在分享自己的一些Java开发岗面试经验(主要是校招),包括我自己总结的八股文、算法、项目介绍、HR面和面试…