IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Redis -- RDB 持久化 -> 正文阅读

[大数据]Redis -- RDB 持久化

数据库状态:服务器中的非空数据库以及他们的键值对统称为数据库状态。

因为 Redis 是内存数据库,它将自己的数据库状态存储在内存里面,所以如果不想办法将存储在内存中的数据库状态保存到磁盘里面,那么一旦服务器进程退出,服务器中的数据也会消失不见。为了解决这个问题, Redis 提供了 RDB 持久化功能, 可以将 Redis 在内存中的数据库状态保存到磁盘里面, 避免数据意外丢失。

数据库状态保存为RDB文件
用RDB文件来还原数据库状态

因为 RDB 文件是保存在硬盘里面的, 所以即使 Redis 服务器进程退出, 甚至运行 Redis 服务器的计算机停机, 只要RDB 文件仍然在, Redis 服务器就可以用它来还原数据库状态。

RDB 文件的创建与载入

有两个 Redis 命令可以用于生成 RDB 文件, 一个是 SAVE, 另一个是 BGSAVE。

  • SAVE 命令会阻塞 Redis 服务器进程,知道 RDB 文件创建完毕为止。
  • BGSAVE 会派生出一个子进程,由子进程负责创建 RDB 文件, 服务器进程(父进程)继续处理命令请求;

与创建不同的是,RDB文件的载入是在服务器启动时自动执行的, 所以 Redis 并没有专门用于载入 RDB 文件的命令,只要 Redis 服务器在启动时检测到 RDB 文件的存在,他就会自动载入RDB文件。

值得一提的是,因为 AOF 文件的刷新频率通常比 RDB 文件的高, 所以如果服务器开启了 AOF 持久化功能, 那么服务器会优先使用 AOF 来还原数据库状态。

服务器载入文件时的判断流程

??SAVE 、BGSAVE命令执行和RDB文件载入时的服务器状态

SAVE 命令正在执行时,客户端发送的所有请求都会被拒绝。


因为 BGSAVE 的保存工作是由子进程执行的,所以期间 Redis 服务器仍然可以继续处理客户端的命令请求。但是,在 BGSAVE 命令执行期间服务器处理 SAVE, BGSAVE, BGREWRITEAOF 三个命令的方式会和平时有所不同。

  • BGSAVE 命令执行期间,客户端发送的 SAVE 命令会被服务器拒绝。避免父进程和子进程同时执行两个 rdbSave 调用,防止产生竞争条件。
  • BGSAVE 命令执行期间,客户端发送的 BGSAVE 命令会被服务器拒绝。因为两个 BGSAVE 命令也会产生竞争条件。
  • BGSAVE 命令正在执行,那么客户端发送的 BGREWRITEAOF 命令会被延迟到 BGSAVE 命令执行完毕之后执行。反之亦然。原因是出于性能方面的考虑。

服务器在载入 RDB 文件期间,会一直处于阻塞状态,知道载入工作完成位置。

RDB 文件结构

一个完整 RDB 文件所包含的各个部分如下:

RDB文件结构
REDISdb_versiondatabasesEOFcheck_sum
  • db_version 长度为 4 个字节,它的值是一个字符串表示的整数,记录了 RDB?文件的版本号。RDB文件的最开头是 REDIS 部分,这个部分的长度为 5 字节,保存着 "REDIS" 五个字符。通过这五个字符,程序可以在载入时快速检查所载入的文件是否 RDB 文件。
  • databases 部分包含着零个或任意多个数据库,以及各个数据库中键值对数据;若服务器的数据库状态为空,那么这部分也为空,长度为 0 字节。
  • EOF常量的长度为1字节,标志着RDB文件正文内容的结束,程序读到这说明所有键值对都已载入完成。
  • check_sum 是一个 8 字节长的无符号整数, 保存着一个校验和。检查 RDB 文件是否出错。

    databases 部分

一个 RDB 文件的 databases 部分可以保存任意多个非空数据库。例如,如果 0 号数据库和 3 号数据库非空,则 RDB 文件如下所示

带有两个非空数据库 的RDB 文件示例
REDISdb_sversiondatabases 0databases 3EOFcheck_sum

其值每个非空数据库又可以表示为一下三部分:

RDB 文件中的数据库结构
SELECTDBdb_numberkey_value_pairs
  • ?SELECTDB 常量的长度为 1 字节,表示接下来要读入的是一个数据库号码;
  • db_number 保存着一个数据库号码,根据号码大小不同,长度可能是1字节、2字节或5字节。
  • key_value_pairs 部分保存了数据库中的所有键值对数据

key_value_pairs部分

RDB 文件的每个 key_value_pairs 部分都保存了一个或以上数量的键值对,如果键值对带有过期时间,那么键值对的过期时间也会被保存在内。

不带过期时间的键值对由以下三部分组成:

不带过期时间的键值对
TYPEkeyvalue

其中TYPE记录了 value 的类型, 长度为 1 个字节,值可以是以下的一个:

  • REDIS_RDB_TYPE_STRING
  • REDIS_RDB_TYPE_LIST
  • REDIS_RDB_TYPE_SET
  • REDIS_RDB_TYPE_ZSET
  • REDIS_RDB_TYPE_HSAH
  • REDIS_RDB_TYPE_LIST_ZIPLIST
  • REDIS_RDB_TYPE_SET_INTSET
  • REDIS_RDB_TYPE_ZSET_ZIPLIST
  • REDIS_RDB_TYPE_HASH_ZIPLIST

带有过期时间的键值对由以下五部分组成:

带有过期时间的键值对
EXPIRETIME_MSmsTYPEkeyvalue
  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-05-06 11:06:45  更:2022-05-06 11:08:31 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 0:39:04-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码