Redis學習-簡單動態字符串SDS

SDS(simple dynamic string)簡單動態字符串

SDS與C語言字符串在redis用法上的區別:

C語言字符串用於字符串不被修改的地方,如日誌輸出
SDS是一個可以被修改的字符串,如鍵,值

結構體保存在sds.h/sdsdr文件中

struct sdhdr{
    //記錄buf數組中已經使用的字節的數量
    int len;
    //記錄buf數組中未使用的數量
    int free;
    //字節數組用於保存字符串
    char buf[];
};

注意C語言字符串的最後一個空字符‘\0’不屬於len

打印字符串時用

printf("%s",s->buf);

SDS與C語言字符串的區別

1.常數複雜度獲取自婦產長度

C語言求長度是需要遍歷的

2.杜絕緩衝區溢出

C語言有一個函數

char *strcat(char*dest,const char*src);

用於把src字符串拼接到dest上面,但是如果dest空間不足就會產生溢出。
Redis有自己的SDS拼接函數sdscat用於拼接,會先檢查是否有足夠大的內存空間,不夠就進行內存拓展,然後再進行拼接。

3.減少修改字符串帶來的內存分配次數

C語言不用說,每次都是重新分配,但是SDS不一樣,實現了:

  1. 空間預分配
    1. 若對SDS修改之後,長度小於1MB,則分配 len+free+1長度的空間
    2. 若大於小於1MB,則會分配len+1MB+1byte的空間
  2. 惰性空間釋放
    如sdstrim(s,“xy”)會刪除s中xy字母,那麼可能會多出一定的空間,redis並不進行釋放,而是留着以免後面的使用
3.二進制安全

C語言字符串以空字符結尾,比如當讀入字符串的時候,遇到空格就會結束,但是SDS是以len的長度來判斷結束的,而且C語言字符串不能保存音,視頻等文件,但是SDS保存的是二進制數據。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章