简单动态字符串(SDS)

Redis中,包含字符串值的键值对在底层都是由SDS实现的

redis > SET msg "hello world"

  • 键值对的键是一个字符串对象,对象的底层实现是一个保存字符串“msg”的SDS。
  • 键值对的值也是一个字符串对象,同上。

redis > RPUSH fruits "apple" "banana" "cherry"

  • 键值对的键是一个字符串对象,对象的底层实现是一个保存字符串“fruits ”的SDS。
  • 键值对的值也是一个列表对象,列表对象包含了三个字符串对象。这三个对象分别由三个SDS实现。
struct sdshdr {
//记录buf数组中已使用字节的数量
//等于SDS所保存字符串的长度
    unsigned int len;
//记录buf数组中未使用字节的数量
    unsigned int free;
//用于保存字符串
    char buf[];

常数复杂度获取字符串长度

c字符串获取其本身长度的时间复杂度为O(n),SDS能够常数复杂度获取字符串长度

杜绝缓冲区溢出

当SDS API需要对SDS进行修改时,API会先检查SDS的空间是否满足修改所需的空间

减少修改字符串时带来的内存重分配次数

空间预分配法

当SDS的API对一个SDS进行修改,并对SDS进行空间扩展的时候,程序不仅会为SDS分配修改所必须的空间,还为SDS分配额外的未使用空间。

惰性空间释放法

当SDS的API需要缩短SDS保存的字符串时,程序并不立即使用内存重分配来回收缩短后多出的字节,而是用free将之记录下来。

SDS使用len属性的值而不是空字符串来判断字符串是否结束

你可能感兴趣的:(简单动态字符串(SDS))