RDB持久化④RDB文件中的value

这是我参与11月更文挑战的第19天,活动详情查看:2021最后一次更文挑战

RDB持久化④RDB文件中的value

RDB文件中的每个value部分都保存一个值对象,根据不同type,value的结构不同

type类型有

/* Dup object types to RDB object types. Only reason is readability (are we
 * dealing with RDB types or with in-memory object types?).
 *
 * 对象类型在 RDB 文件中的类型
 */
#define REDIS_RDB_TYPE_STRING 0
#define REDIS_RDB_TYPE_LIST   1
#define REDIS_RDB_TYPE_SET    2
#define REDIS_RDB_TYPE_ZSET   3
#define REDIS_RDB_TYPE_HASH   4

/* Object types for encoded objects. */
/*
 * 编码对象的方式
 */
#define REDIS_RDB_TYPE_HASH_ZIPMAP    9
#define REDIS_RDB_TYPE_LIST_ZIPLIST  10
#define REDIS_RDB_TYPE_SET_INTSET    11
#define REDIS_RDB_TYPE_ZSET_ZIPLIST  12
#define REDIS_RDB_TYPE_HASH_ZIPLIST  13
复制代码

字符串对象

type为REDIS_RDB_TYPE_STRING,value保存的就是一个字符串对象,字符串对象编码为REDIS_ENCODING_INT或者REDIS_ENCODING_RAW

REDIS_ENCODING_INT说明对象中保存的是长度不超过32位的整数,结构为encoding+整数,encoding的值可以为:

#define REDIS_RDB_ENC_INT8 0        /* 8 bit signed integer */
#define REDIS_RDB_ENC_INT16 1       /* 16 bit signed integer */
#define REDIS_RDB_ENC_INT32 2       /* 32 bit signed integer */
复制代码

表示文件使用 多少位来保存这个整数

REDIS_ENCODING_RAW说明对象保存的是一个字符串值,字符串长度大于20直接,会被压缩后保存

没有被压缩的结构为len+string,即字符串长度和字符串

压缩的结构为REDIS_RDB_ENC_LZF+compressed_len+origin_len+compressed_string

REDIS_RDB_ENC_LZF表示被LZF算法压缩,compressed_len表示字符串被压缩后的长度,origin_len为字符串之前长度,compressed_string为压缩后的字符串

列表对象

type为REDIS_RDB_TYPE_LIST,value保存的就是一个REDIS_ENCODING_LINKEDLIST编码的列表对象,RDB文件保存结构为list_length+item,就是列表长度和各个列表项

集合对象

type为REDIS_RDB_TYPE_SET,value保存的是REDIS_ENCODING_HT编码的集合对象,文件保存结构为set_size+elem,set_size是集合大小,elem表示各个集合元素

哈希表对象

type为REDIS_RDB_TYPE_HASH,value为REDIS_ENCODING_HT编码的集合对象,文件保存结构为hash_size+key+value+key+value。。。

有序集合对象

type为REDIS_RDB_TYPE_ZSET,value为REDIS_ENCODING_SKIPLIST编码的有序集合对象,文件保存结构为sorted_set_size+member1+score1+member2+score2+。。。

INTSET编码的集合

如果type的值为REDIS_RDB_TYPE_SET_INTSET,value保存的是整数集合对象,文件保存是将整数集合转换为字符串对象,将这个字符串对象保存到RDB文件里

在程序读入RDB文件过程中,会根据TYPE值,先读入字符串对象,然后转换成原来的整数集合对象

ZIPLIST编码的列表、哈希表或有序集合

type为REDIS_RDB_TYPE_LIST_ZIPLIST REDIS_RDB_TYPE_HASH_ZIPLIST REDIS_RDB_TYPE_ZSET_ZIPLIST,value保存的是压缩列表,RDB文件保存的时候先将压缩列表转成字符串对象,然后将字符串对象保存到RDB文件中

读入RDB文件的时候先把字符串对象转换为压缩列表对象,根据TYPE的值,REDIS_RDB_TYPE_LIST_ZIPLIST 压缩列表对象为列表,REDIS_RDB_TYPE_HASH_ZIPLIST 压缩列表对象为哈希表,REDIS_RDB_TYPE_ZSET_ZIPLIST压缩列表对象为有序集合。

猜你喜欢

转载自juejin.im/post/7032232305259184164
今日推荐