Redis之String数据结构底层原理

对于不同的对象,Redis会使用不同的类型来存储。对于同一种类型type会有不同的存储形式encoding。

对于string类型的字符串,其底层编码方式共有三种,分别为int、embstr和raw。

int:当存储的字符串全是数字时,此时使用int方式来存储;

embstr:当存储的字符串长度小于44个字符时,此时使用embstr方式来存储;

raw:当存储的字符串长度大于44个字符时,此时使用raw方式来存储;

对于embstr和raw这两种encoding类型,其存储方式还不太一样。

对于embstr类型,它将RedisObject对象头和SDS对象在内存中地址是连在一起的,但对于raw类型,二者在内存地址不是连续的。
在这里插入图片描述
sds的逻辑图
在这里插入图片描述
len 保存了SDS保存字符串的长度

buf[] 数组用来保存字符串的每个元素

free 记录了 buf 数组中未使用的字节数量

小结
1:String 类型对象三种实现方式,int,embstr,raw

2:应用场景

Session利用redis做session共享内存。

自增和自减,用于做一些网站的请求数量,或者论坛的点赞数,评论数。最终会将这些统计数据放到硬盘中。

在功能中,除非是必要的情况,除了上述的这几个需求,尽量不要使用string类型,底层会浪费大量的内存空间。

3:如果使用embstr,每次最多开辟64个字节的空间,只有44个字节用于存储数据。

如果使用raw编码,则每次开辟空间都会留一些空间,如果数据成都变大了,则内存也会继续变大,进而浪费空间。而int只是针对数据是数值,只有整型才是int类型。

4:SDS 是Redis自己构建的一种简单动态字符串的抽象类型,并将 SDS 作为 Redis 的默认字符串表示。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值