redis debug object 源码分析

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

问:redis的debug object命令算出来的serializedlength是如何算出的?

解答:

见redis源码中的debug.c 函数 void debugCommand(redisClient *c) 的这一段代码:

redis debug object 源码分析_第1张图片


off_t rdbSavedObjectLen(robj *o)函数见rdb.c:

redis debug object 源码分析_第2张图片


int rdbSaveObject(rio *rdb, robj *o) 的返回值即为 serializedlength

int rdbSaveObject(rio *rdb, robj *o) 函数见rdb.c:  代码太多,见:https://github.com/miaoyc1989/redis-3.0-annotated/blob/unstable/src/rdb.c

简单来说,在rdbSaveObject函数中,redis会根据传入的对象数据类型调用相关的函数去计算对象占用的空间字节数

数据类型与计算所需空间函数的对应关系如下表:


短结构 长结构
REDIS_LIST

ziplistBlobLen(返回整个ziplist占用的内存字节数)、

rdbSaveRawString(函数返回保存字符串所需的空间字节数

rdbSaveLen(写入成功返回保存编码后的 len 所需的字节数)、

listRewind、listNext、listNodeValue(以上三个函数用于遍历列表项)、

rdbSaveStringObject (函数返回rdb保存字符串对象所需的字节数)

REDIS_SET

intsetBlobLen(返回整数集合现在占用的字节总数量)、

rdbSaveRawString

rdbSaveLen、

dictNext、dictGetKey(以上两个函数用于遍历集合成员)、

rdbSaveStringObject

REDIS_ZSET ziplistBlobLen、rdbSaveRawString

rdbSaveLen、

dictNext、dictGetKey、dictGetVal(以上三个函数用于遍历有序集合)

rdbSaveStringObject、rdbSaveDoubleValue(返回值为int)

REDIS_HASH ziplistBlobLen、rdbSaveRawString

rdbSaveLen、

dictNext、dictGetKey、dictGetVal(以上三个函数用于迭代字典)、

rdbSaveStringObject

REDIS_STRING rdbSaveStringObject


上面对逻辑的描述不够清晰,想要知道具体细节,还是需要去看源码

附表:

redis中几种数据类型的短结构和长结构编码对应关系:


短结构 长结构
list ziplist linkedlist
hash ziplist hashtable
set intset hashtable
zset ziplist skiplist






转载于:https://my.oschina.net/justfairytale/blog/610505

你可能感兴趣的:(数据库,开发工具,python)