Redis底層數(shù)據(jù)結(jié)構(gòu) - SDS動態(tài)字符串

1,SDS簡單動態(tài)字符串(Simple Dynamic String)

1)sds.h中定義了幾種sdshdr的結(jié)構(gòu)體。
typedef char *sds; //定義sds為一個char數(shù)組
int len;//已經(jīng)使用的長度
int alloc;//buf總長度, 不包括頭部和\0
char buf[];//sds底層char數(shù)組 buf.length - len 等于free的長度

image.png

struct sdshdr {

    // buf 已占用長度
    int len;

    // buf 剩余可用長度
    int free;

    // 實際保存字符串?dāng)?shù)據(jù)的地方
    char buf[];
};

2)創(chuàng)建sds對象
sh = s_malloc(hdrlen+initlen+1);//分配hdrlen + initlen長度,加1(用于存儲'\0')
s[initlen] = '\0';//結(jié)尾字符串賦值

image.png

image.png

3)SDS擴容
SDS_MAX_PREALLOC : 1024 * 1024字節(jié) = 1MB
當(dāng)小于1MB的字符串變長時,分配*2的空間;大于1MB的字符串變長時,多分配1MB空間
image.png

4)擴容過程

//set test:sds:append:key hello
struct sdshdr{
  len = 5;
  free = 0;
  buf = "hello\0"
}
//append test:sds:append:key world
struct sdshdr{
  len = 10;
  free = 10;
  buf = "hello world\0             "http://共10 + 1 + 10 = 21個字節(jié)
}
//append test:sds:append:key hzq
struct sdshdr{
  len = 10;
  free = 10;
  buf = "helloworldhzq\0          "http://共10 + 3 + 1 + 7 = 21個字節(jié)(不會觸發(fā)內(nèi)存重分配)
}

2,SDS特性與使用場景

1)sds實現(xiàn)字符串對象。字符串對象作為value時,保存string則是sds類型,保存long則是long類型
2)redis的鍵總是 sds類型的字符串對象。
3)sds二進制安全。s[initlen] = '\0'; //創(chuàng)建的時候,不會驗證\0字符。存入是什么數(shù)據(jù)取出來還是什么數(shù)據(jù)
3)在 Redis 中, 客戶端傳入服務(wù)器的協(xié)議內(nèi)容、 aof 緩存、 返回給客戶端的回復(fù), 等等, 這些重要的內(nèi)容都是由 sds 類型來保存的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容