1. 程式人生 > >Redis 3.0 SDS類型筆記

Redis 3.0 SDS類型筆記

nbsp 字符串長度 tro 移動 字節 類型 redis 3.0 c語言 地址

Redis 中的字符串沒有使用 C語言中的字符指針(char *),而是使用了自定義的結構 sds。

文件:

sds.h  sds.c

結構:

struct sdshdr {
    
    int len; // 填充的字符串長度
    
    int free;  // buf 中未填充的空位置
    
    char buf[];  // 用於存放實際的字符串(包含為使用的空間),以 ‘\0‘ 結尾
};

基本結構如上所示,其中 buf 中為預分配的字符串空間,可能等於實際字符串所需空間長度,也可能大於實際的字符串長度

len 為實際的字符串長度,這樣可以很方便的獲取到字符串的長度,

free 為 buf 數組中為使用到的數組長度,可以防止數組越界

同時,文件中還維護了一個指針

typedef char *sds;  // 類型別名,實例指向數據結構中的 buf 空間

一般操作返回的都是這個指針,如果要獲取整個sds,需要將指針向前移動 sizeof(struct sdshdr)個字節來獲取到結構開頭地址(void *),之後強轉為 sdshdr 結構體指針

struct sdshdr *sh = (void*)(s-(sizeof(struct sdshdr)));

Redis 3.0 SDS類型筆記