简单动态字符串

Redis 没有直接使用 C 语言原有的字符串,而是创建了一种名为简单动态字符串(Simple Dynamic String,SDS)的抽象类型,并以 SDS 作为默认的字符串表示。

SDS 的定义

struct sdshdr{
    //记录buf数组中已使用的字节数量,不包括'\0',即SDS所保存的字符串长度
    int len;
    //buf数组中为使用的字节数量
    int free;
    char buf[];
};
SDS.png

SDS 的使用

这里先解释下为什么 Redis 使用 SDS 作为默认的 String。这是因为在 Redis 里的键值都很大概率是字符串来的,而用户又有可能经常改这些值,如果使用 C 语言原有的字符串在某些情况如拼接字符串的时候就有可能溢出,导致出错,并且在修改字符串时可能会很频繁地重新分配内存。

那么 SDS 显然是针对这些情况作出了优化。

字符串拼接时,由于有 free ,可以很快知道剩余空间是否足够,并且根据判断结果申请内存。而在申请内存的过程中,为了避免下次 append 字符串时,还要重新申请内存,会先判断修改后的字符串是否小于 1M ,是的话,申请的内存为修改后的 2 倍+1字节,即 free = len(修改后的),1 是 ‘\0’。如果修改后字符串大于 1M ,就令 len = 30M,free = 1。

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