简述
Redis中的String类型是我们经常使用到的数据类型,而且在Redis中所有的key都是String类型存储的。今天我们来看下Redis的String类型😊。
String类型存储结构
当我们保存64位有符号整数的时候,String类型会把它保存为一个8字节Long类型整数,这种保存方式叫做int编码方式。
如果我们爆粗的数据中包含字符的时候,String类型会使用简单动态字符串(SDS)结构体来保存。
Redis中RedisObject分析我之前也做过了redisObject的分析,有兴趣的小伙伴可以看下。我们知道RedisObject数据结构如下:
Redis其实还对了数据不同类型做了专门的处理。
- Long类型。RedisObject中的指针直接赋值为整数数据,不需要用额外的指针指向整数,节省了指针的空间开销。
- String类型。
- 字符串类型小于等于44字节时,RedisObject中的元数据、指针和SDS是一块连续的内存区域,这样可以避免内存碎片。这种布局方式成为embstr编码方式。
我这里解释下为什么是44字节。因为新版的SDS做了优化,对于字符串比较小的时候,len和alloc是int8类型,占用一个字节。flags是char类型,取值为0-4,也是占用一个字节。所以sdshdr最小需要3个字节。RedisObject中,元数据占8字节,指针占8字节,所以占用了16字节。加上sdshdr就是19字节。
redis中,如果超过64字节就是大字符串,所以RedisObject+sdshdr8的总长度是64字节的情况下,留给buf的长度就只剩下45字节了。因为字符串结尾需要一个\0占用了一个字节,所以留给字符串的长度也就只有44字节了。如图所示:
- 字符串大于44字节时,SDS的数据量就开始变多了,Redis认为这是大字符串,不再把SDS和RedisObject布局在一起了,而是会给SDS分配独立的内存空间,并用指针指向SDS数据结构。这种布局方式被称为raw编码模式。
下面的图片就是三种编码模式的示意图。
总结
在Redis中,我们经常使用的String类型,Redis也帮我们做很多优化。数据类型为Long类型,则RedisObject中的指针直接赋值为整数数据,不需要用额外的指针指向整数,节省了指针的空间开销;数据类型为支付串类型,如果小于等于44字节,RedisObject中的元数据、指针和SDS是一块连续的内存区域,避免内存碎片。如果大于44字节,则会单独给SDS分配独立的内存空间,并用指针指向SDS数据结构。
评论区