首页 > 数据库 >Redis-单机数据库-RDB持久化

Redis-单机数据库-RDB持久化

时间:2023-01-10 14:59:26浏览次数:45  
标签:单机 对象 Redis REDIS 键值 RDB 字符串 TYPE

RDB文件结构

RDB 文件的最开头是 REDIS 部分, 这个部分的长度为 5 字节, 保存着 "REDIS" 五个字符。 通过这五个字符, 程序可以在载入文件时, 快速检查所载入的文件是否 RDB 文件。

db_version 长度为 4 字节, 它的值是一个字符串表示的整数, 这个整数记录了 RDB 文件的版本号, 比如 "0006" 就代表 RDB 文件的版本为第六版。

databases 部分包含着零个或任意多个数据库, 以及各个数据库中的键值对数据:

  • 如果服务器的数据库状态为空(所有数据库都是空的), 那么这个部分也为空, 长度为 0 字节。
  • 如果服务器的数据库状态为非空(有至少一个数据库非空), 那么这个部分也为非空, 根据数据库所保存键值对的数量、类型和内容不同, 这个部分的长度也会有所不同。

EOF 常量的长度为 1 字节, 这个常量标志着 RDB 文件正文内容的结束, 当读入程序遇到这个值的时候, 它知道所有数据库的所有键值对都已经载入完毕了。

check_sum 是一个 8 字节长的无符号整数, 保存着一个校验和, 这个校验和是程序通过对 REDIS 、 db_version 、 databases 、 EOF 四个部分的内容进行计算得出的。 服务器在载入 RDB 文件时, 会将载入数据所计算出的校验和与 check_sum 所记录的校验和进行对比, 以此来检查 RDB 文件是否有出错或者损坏的情况出现。


databases部分

每个非空的database在 RDB 文件中都可以保存为 SELECTDB 、 db_number 、 key_value_pairs 三个部分,

SELECTDB 常量的长度为 1 字节, 当读入程序遇到这个值的时候, 它知道接下来要读入的将是一个数据库号码。

db_number 保存着一个数据库号码, 根据号码的大小不同, 这个部分的长度可以是 1 字节、 2 字节或者 5 字节。 当程序读入 db_number 部分之后, 服务器会调用 SELECT 命令, 根据读入的数据库号码进行数据库切换, 使得之后读入的键值对可以载入到正确的数据库中。

key_value_pairs 部分保存了数据库中的所有键值对数据, 如果键值对带有过期时间, 那么过期时间也会和键值对保存在一起。 根据键值对的数量、类型、内容、以及是否有过期时间等条件的不同, key_value_pairs 部分的长度也会有所不同。


key_value_pairs部分

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

不带过期时间的键值对在 RDB 文件中对由 TYPE 、 key 、 value 三部分组成。

带过期时间的键值对由EXPIRETIME_MSmsTYPEkeyvalue 五部分组成。


字符串对象

TYPE 的值为 REDIS_RDB_TYPE_STRING

  • 如果字符串对象的编码为 REDIS_ENCODING_INT ,则其结构为:

ENCODING 的值可以是 REDIS_RDB_ENC_INT8 、 REDIS_RDB_ENC_INT16 或者 REDIS_RDB_ENC_INT32 三个常量的其中一个。

  • 如果字符串对象的编码为 REDIS_ENCODING_RAW,根据字符串长度的不同, 有原生和压缩两种方法来保存这个字符串:


列表对象

TYPE 的值为 REDIS_RDB_TYPE_LIST

  •  value 保存的是一个 REDIS_ENCODING_LINKEDLIST 编码的列表对象,结构为:

每个item由该项的长度和字符串内容组成。


哈希对象

TYPE 的值为 REDIS_RDB_TYPE_HASH

  • value 保存的是一个 REDIS_ENCODING_HT 编码的哈希对象,结构为:

每个key和value都由长度和字符串内容组成。


集合对象

TYPE 的值为 REDIS_RDB_TYPE_SET 

  • value 保存的是一个 REDIS_ENCODING_HT 编码的集合对象,结构为:

每个elem都由长度和字符串内容组成。


有序集合对象

TYPE 的值为 REDIS_RDB_TYPE_ZSET 

  • value 保存的是一个 REDIS_ENCODING_SKIPLIST 编码的有序集合对象,结构为:

score转换为字符串进行保存,每一个member和score都由长度和字符串内容组成。


如果 TYPE 的值为 REDIS_RDB_TYPE_SET_INTSET , 那么 value 保存的就是一个整数集合对象, RDB 文件保存这种对象的方法是, 先将整数集合转换为字符串对象, 然后将这个字符串对象保存到 RDB 文件里面。

如果程序在读入 RDB 文件的过程中, 碰到由整数集合对象转换成的字符串对象, 那么程序会根据 TYPE 值的指示, 先读入字符串对象, 再将这个字符串对象转换成原来的整数集合对象。


如果 TYPE 的值为 REDIS_RDB_TYPE_LIST_ZIPLIST 、 REDIS_RDB_TYPE_HASH_ZIPLIST 或者 REDIS_RDB_TYPE_ZSET_ZIPLIST , 那么 value 保存的就是一个压缩列表对象, RDB 文件保存这种对象的方法是:

  1. 将压缩列表转换成一个字符串对象。
  2. 将转换所得的字符串对象保存到 RDB 文件。

如果程序在读入 RDB 文件的过程中, 碰到由压缩列表对象转换成的字符串对象, 那么程序会根据 TYPE 值的指示, 执行以下操作:

  1. 读入字符串对象,并将它转换成原来的压缩列表对象。
  2. 根据 TYPE 的值,设置压缩列表对象的类型

SAVE 命令由服务器进程直接执行保存操作,所以该命令会阻塞服务器。

BGSAVE 命令由子进程执行保存操作,所以该命令是异步的,不会阻塞服务器。

标签:单机,对象,Redis,REDIS,键值,RDB,字符串,TYPE
From: https://www.cnblogs.com/gcr277/p/17039703.html

相关文章

  • 【Redis 技术探索】「数据迁移实战」手把手教你如何实现在线 + 离线模式进行迁移 Redi
    redis-full-check的使用背景在经历了之前的文章内容章节内容,已完成Redis迁移后,可能会存在以下问题需要进行数据迁移之后的对比。例如,如果Redis迁移的过程出现异常,源端与目的......
  • 【Redis 技术探索】「数据迁移实战」手把手教你如何实现在线 + 离线模式进行迁移 Redi
    在线数据迁移方式对于大多数场景下的Redis的数据迁移,还是比较推荐大家参考我之前的前两篇文章。【Redis技术探索】「数据迁移实战」手把手教你如何实现在线+离线模......
  • Redis基本讲解
    前言1.什么是Redis?它主要用来什么的?Redis,英文全称是RemoteDictionaryServer(远程字典服务),是一个开源的使用ANSIC语言编写、支持网络、可基于内存亦可持久化的日志型、K......
  • Redis-单机数据库-数据库键空间
    Redis是一个键值对(key-valuepair)数据库服务器,服务器中的每个数据库都由一个 redis.h/redisDb 结构表示,其中, redisDb 结构的dict 字典保存了数据库中的所有键值对,......
  • Redis的String类型,原来这么占内存
    Redis的String类型,原来这么占内存存一个Long类型这么占内存,Redis的内存开销都花在哪儿了?1、场景介绍假设现在我们要开发一个图片存储系统,要求这个系统能够根据图片......
  • SimpleAdmin手摸手教学之:Redis缓存
    一、说明系统中有很多数据是不会经常修改的,但是读取的频率确很高,所以这时候就需要使用缓存将这些数据缓存起来。本系统采用Redis分布式缓存,将一些基本信息表缓存在内存中,......
  • hadoop 2.4.1单机安装教程 99.9%成功率
    1.先自己安装centos7.X 64位2.自己想办法安装JDK1.7,记住不要opensdk的3.准备好hadoop-2.4.1 64位,官网下载默认是32位的,所以上淘宝买CSDN下载4.修改系统配置vim/etc/s......
  • Redis-数据结构与对象-对象
    对象Redis并没有直接使用这些数据结构来实现键值对数据库,而是基于这些数据结构创建了一个对象系统,这个系统包含字符串对象、列表对象、哈希对象、集合对象和有序集合对......
  • Redis 数据结构-简单动态字符串
    Redis数据结构-简单动态字符串 无边落木萧萧下,不尽长江滚滚来。 1、简介Redis之所以快主要得益于它的数据结构、操作内存数据库、单线程和多路I/O......
  • Redis-数据结构与对象-压缩列表
    压缩列表当一个列表键只包含少量列表项,并且每个列表项要么就是小整数值,要么就是长度比较短的字符串,那么Redis就会使用压缩列表(ziplist)来做列表键的底层实现。当一......