redis字符串 - 969251639/study GitHub Wiki

redis内部使用SDS(simple dynamic string)进行字符串的存储,它的结构如下:

struct sdshdr {
    //记录buf已使用的字节数量,也就是所保存的字符串的长度
    int len;
    //记录buf中未使用的字节数量
    int free;
    // 字节数组,用于保存字符串
    char buf[];
}

比如存储一个redis的字符串,会有如下结构

可以看到是以\0作为结尾,符合C语言规范,不一样的是内部存储了一个len,可以直接通过O(1)来获取,效率高,另外SDS的扩展也是动态的,当要存放的字符串buf不够字节时会先申请一个大的,然后再存放,其实现原理如下:

  1. SDS有一个free来预留空间,当新增的新字符串的长度小于free的字节数时直接拿free来存放,不需要扩容
  2. 如果free不够,那么需要申请更大的内存来存放,扩容时如果SDS的长度小于1M,则每次扩容的大小是len属性和free属性相同,比如将len变成13字节,那么程序也会分配13字节的未使用空间,SDS的buf数组实际长度将变成13 + 13 + 1 = 27字节,如果SDS的长达大于1M,那么每次扩容时都会分配1M作为未使用空间