Redis 3.0 SDS類型筆記
阿新 • • 發佈:2018-12-31
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類型筆記