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 的默认字符串表示。

点击阅读全文
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐