类型转换
通过在redis-cli中实验,可以发现当字符串大于44字节时确实从embstr变为raw了
通过阅读源码时也发现,在创建字符串对象时根据字符串长度来决定使用哪种实现类型
44是怎么算出来的
这跟底层的类型结构有关,目前字符串对象根据字符串长度的不同分为以下4种类型
根据redis创建embstr字符串对象的逻辑,是使用了sdshdr8
创建embstr
,那么加上RedisObject
就会变成下面这样
redis中的内存分配器分配内存的大小都是2、4、8、16、32、64字节
sdshdr最小需要3
个字节,加上RedisObject
,也就是19
字节,最少需要申请32
字节的内存
redis认为如果超过64
字节就是大字符串,所以在RedisObjec
+sdshdr8
的总长度是64
字节的情况下,那么留给buf的长度就只剩下45
字节,由于字符串结尾需要一个\0
占用一个字节,所以留个字符串的长度就只有44
字节了
本文使用 mdnice 排版