您的位置:首页 > 数据库 > Redis

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

2015-07-31 11:40 465 查看
了解完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以避免空间浪费。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: