这是我参与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压缩列表对象为有序集合。