Redis基础类型的String底层实现

本文详细解释了Redis数据库中String类型的实现,特别关注了其底层的SimpleDynamicString(SDS)结构,以及RAW、EMBSTR和int编码方式的选择原理。
摘要由CSDN通过智能技术生成

Redis数据库中所有的键都是String类型,String 的底层实现是SDS(Simple Dynamic String)。

SDS主要是对C语言做了一个封装,是的SDS具有动态扩容、O(1)复杂度的长度计算的特点。

主要右三个部分组成:

  •  len  :实际使用长度
  • free buf 数组中未使用字节的数量
  • char  buf[]  用于保存字符串

struct sdshdr{

        int len;   //记录buf 数组中已使用字节的数量 等于 SDS所保存的字符串的长度

        int  free;//记录buf数组中未使用的字节数量;

        char nuf[ ];   //字节数组,用于保存字符串

}

Redis 中的任意数据类型的键和值都会被封装成⼀个 RedisObject,即 Redis 对象。会在 Redis 对象中主要由三个 字段:当前数据结构的类型、编码⽅式和指向实际数据的指针

String类型,⾸先会在Redis对象中指明他的类型为OBJ_STRING

String类型有三种编码⽅式:

1、其最基本的编码⽅式是 RAW 编码,基于简单动态字符串SDS来实现,存储上限为512mb。他就是在内存中申 请⼀个 SDS,然后让 Redis 对象的指针指向 SDS 即可。

2、当要存储的 SDS 的⻓度⼩于 44 字节,就会使⽤ EMBSTR 编码,此时 Redis 对象的头部和 SDS 是在⼀个连续 的内存空间中,申请内存的时候只需要⼀次分配,效率更⾼。为什么是 44 个字节呢?因为Redis对象数据结构中其 头部有 16 个字节。然后SDS中头部 3 个字节,尾巴结束字符⼀个字节,加在⼀起共 20 个字节,20 个字节加上 44 个字节就是 64 个字节,因为 redis 内存分配会以 2 n 次⽅进⾏分配,64 个字节不会产⽣内存碎⽚。

3、如果要存储的字符串是⼀个整数,且⼤⼩不超过 8 位⼆进制能表示的范围。就采⽤ int 的编码⽅式,直接让 redis 对象的指针位设置为这个整数
如图:

  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小俱的一步步

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值