
Redis之String数据结构底层原理
1:不同类型的存储对于不同的对象,Redis会使用不同的类型来存储。对于同一种类型type会有不同的存储形式encoding。对于string类型的字符串,其底层编码方式共有三种,分别为int、embstr和raw。int:当存储的字符串全是数字时,此时使用int方式来存储;embstr:当存储的字符串长度小于44个字符时,此时使用embstr方式来存储;raw:当存储的字符串长度大于44个字符时
1:不同类型的存储
对于不同的对象,Redis会使用不同的类型来存储。对于同一种类型type会有不同的存储形式encoding。
对于string类型的字符串,其底层编码方式共有三种,分别为int、embstr和raw。
int:当存储的字符串全是数字时,此时使用int方式来存储;
embstr:当存储的字符串长度小于44个字符时,此时使用embstr方式来存储;
raw:当存储的字符串长度大于44个字符时,此时使用raw方式来存储;
使用object encoding key可以查看key对应的encoding类型,如下所示:
2:SDS:Simple Dynamic String
对于embstr和raw这两种encoding类型,其存储方式还不太一样。
对于embstr类型,它将RedisObject对象头和SDS对象在内存中地址是连在一起的,但对于raw类型,二者在内存地址不是连续的。
3:sds的逻辑图
len 保存了SDS保存字符串的长度
buf[] 数组用来保存字符串的每个元素
free 记录了 buf 数组中未使用的字节数量
4:小结
1:String 类型对象三种实现方式,int,embstr,raw
2:应用场景
Session利用redis做session共享内存。
自增和自减,用于做一些网站的请求数量,或者论坛的点赞数,评论数。最终会将这些统计数据放到硬盘中。
在功能中,除非是必要的情况,除了上述的这几个需求,尽量不要使用string类型,底层会浪费大量的内存空间。
3:如果使用embstr,每次最多开辟64个字节的空间,只有44个字节用于存储数据。
如果使用raw编码,则每次开辟空间都会留一些空间,如果数据成都变大了,则内存也会继续变大,进而浪费空间。而int只是针对数据是数值,只有整型才是int类型。
4:SDS 是Redis自己构建的一种简单动态字符串的抽象类型,并将 SDS 作为 Redis 的默认字符串表示。
更多推荐
所有评论(0)