Redis的简单动态字符串——Simple Dynamic String

了解完Redis基本的数据结构之后再来看对象,会发现原来是这样从下到上一步步实现的。


Simple Dynamic String(简单动态字符串)

(1)SDS的结构


struct sdshdr {
    int len;    //记录字符串长度,如图,len=5
    int free;    //记录未使用的字节数,free=5
    char buf[];
};


(2) 与C语言的比较


上图为C字符串的存储结构,但它无法满足Redis对字符串在安全性、效率、以及功能方面的要求。

(a)print

    SDS无需编写专门的打印函数:printf("%s", s->buf),还兼容部分C String的其它函数;

(b)length

    C计算长度是遍历到'\0',O(N);

    SDS取len,O(1)

(c)缓冲区溢出

    对于C的char *strcat(char *dest, const char *src)来说,是将src拼到dest之后;但如果dest空间分配不足,拼接src之后,则会造成拼接后的字符串覆盖了原来dest后边的内容,造成缓冲区溢出;

    SDS的空间分配策略完全杜绝了缓冲区溢出的可能性,因为它会首先检查空间是否满足要求。接下来介绍SDS的空间分配策略。


(3)SDS的空间分配策略

(a)空间预分配

    当遇到诸如append之类增长字符串的操作时,如果空间需要扩展,则按如下规则进行扩展:

  •     若len<1MB,比如len=13,则空间不够时len扩展到13*2+1=27,额外的1字节用于保存空字符;
  •     若len>=1MB,比如len=30MB,则分配1M,长度变为30MB+1MB+1byte。
(b)惰性空间释放
    sdstrim接受一个SDS和一个C字符串,移除SDS中所有在C中出现过的字符。由于惰性释放空间,所以不会缩短总长度,但redis也提供了缩短长度的API以避免空间浪费。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值