Redis的底层数据结构---SDS

SDS(redis5.0的SDS结构)

图来自小林coding
参数解释:
len :表示字符串的长度,获取字符串长度时,可以直接返回该值,不用像c语言那样便利
alloc:分配的空间长度,用alloc-len就可以表示剩余的长度,当需要合并字符串的时候,先判断空间是否足够,这样就不会出现缓冲区溢出的情况
flags: 来表示不同类型的 SDS。一共设计了 5 种类型,分别是 sdshdr5、sdshdr8、sdshdr16、sdshdr32 和 sdshdr64,后面在说明区别之处。 这 5 种类型的主要区别就在于,它们数据结构中的 len 和 alloc 成员变量的数据类型不同。
buf[]:字符数组,用来保存实际数据。不仅可以保存字符串,也可以保存二进制数据。

SDS与C字符串的区别

1.常数复杂度获取字符串长度
因为SDS自带len值,所以获取长度的时间复杂度为O(1)
2.杜绝缓冲区溢出
当SDSAPI需要对SDS进行修改时,API会先检查SDS的空间是否满足修改所需的要求,如果不满足的话,API会自动将SDS的空间扩展至执行修改所需的大小,然后才执行实际修改操作,所以不会出现缓冲区溢出。
3.减少修改字符串时带来的内存重新分配次数
在SDS中,buf数组的长度不一定就是字符数量加一,数组中可以包含未使用的字节,而这些未使用字节的空间可以有alloc-len得到。
对于未使用的空间,SDS实现了空间预分配和惰性空间释放两种优化策略。

  • 空间预分配
           空间预分配用于优化SDS的字符串增长操作。当SDS的API对一个SDS进行修改,并且需要对SDS进行空间扩展的时候,程序不仅会为了SDS分配修改所必须要的空间,还会为SDS分配额外的未使用的空间。
    分配策略
    1.如果对SDS进行修改之后,SDS的长度小于1MB,那么程序分配和len属性同样大小的未使用空间,这时alloc的大小为len的两倍。
    2.如果对SDS进行修改之后,SDS的长度大于等于1MB,那么程序分配1MB未使用空间,这时alloc的大小为len的两倍。
    2.惰性空间释放
           惰性空间释放用于优化SDS的字符串缩短操作,当SDS的API需要缩短SDS保存的字符串时,程序并不是立即使用内存重新分配来回收多出来的字节,而是将未使用空间保存留在SDS里面。通过惰性空间释放策略,SDS避免了缩短字符串时所需的内存重新分配,并为将来可能有的增长操作提供了优化。并且提供了相应的API,让我们可以在有需要的时候真正释放SDS的未使用空间。

4.二进制安全
因为SDS使用len属性的值而不是空字符串来判断字符串是否结束,数据在写入的时候时什么样的,被读取的时候就说什么样的,不会对其中的数据做任何限制。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值