源码解析之sds小结(4)

背景

本次阅读的版本是redis5.0,sds共分为5种数据结构,sdshdr5,sdshdr8,sdshdr16,sdshdr32,sdshdr64。

阅读主要的源码文件为sds.hsds.c ,作为redis对字符串封装的结构体,它在内存控制,二进制安全,快速读取,字符串变长方面表现更好。

缺点:占用更多的内存空间,毕竟有头信息的存在。

1.sds基本结构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D8jYTyRy-1651841323086)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/5cc2673e-80a3-4565-9d6d-9d3850c728e8/sds_字符串基本结果.png)]

从上图可以看出,其基本结构可以大致分为:

头信息部分:

  1. 字符串总长度:alloc
  2. 字符串已使用长度:len
  3. 字符串类型标识:flag
  4. 字符串数组: buff[]

而sds.c中,主要就是对于sds的各种操作,其中包括前面写的sdsnewlen(sds对象构建),sdsMakeRoomFor(sds扩容),sdsRemoveFreeSpace (sds压缩free空间)等基本操作。

通过阅读,发现对sds的操作主要分为下面几个操作:

对len操作
对alloc操作
对sds类型进行变更
对buff[]进行操作

而针对类型变更需要重新申请一片内存,然后通过复制和构造新sds,并释放旧sds。


2.sds的特殊性

虽然sds的结构体是包含4个部分,但是sds的指针并不是指向头部的,而是指向buff[]的。

这个实现其实并不新鲜,在mysql的行结构中,上一条记录指向下一条记录的指针(数据位置)也是真实数据位置,而不是行结构的头部位置。(可以参考一下我的mysql行结构解析里面的内容)

2.1 sds指向buff[]意义是啥呢?

1.跟C语言的字符串结构一致,向下兼容

2.向前拿到sds类型,就知道头的大小,就能计算出sds字符串的实际长度

3.拿到实际长度就能从sds当前指针向后读取实际长度的大小,就是实际字符串。(更快)

这样就不用单纯依据\0来作为字符串结束符来读取字符串了。(二进制安全,\0不会造成截断问题)

3.核心方法

  1. sdsHdrSize 计算sds的头部大小
  2. sdsReqType 根据字符串长度获取sds类型
  3. sdsnewlen 根据初始值和初始长度创建sds
  4. sdsfree(sds s) 释放sds
  5. sdsupdatelen 对第一个\0终止符进行截取
  6. sdsclear 清理buff[] ,并将终止符设置到字符串的第一个位置
  7. sdsMakeRoomFor 字符串扩容一定长度
  8. sdsRemoveFreeSpace 字符串sds压缩,移除free空间,也就是len=alloc
  9. sdsAllocSize sds整个结构所占字节大小
  10. *sdsAllocPtr 获取sds的头部指针

其他的方法就不一一列举了,其实,只要了解sds的结构和操作方式,其他的一些方法理解起来基本没啥问题。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值