1. 程式人生 > >Redis 3.0 SDS結構筆記

Redis 3.0 SDS結構筆記

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)));