为什么Redis中的字符串小于44字节时是embstr类型,大于44字节时是raw类型

3,492 阅读1分钟

类型转换

通过在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 排版