Redis SDS

SDS(Simple Dynamic String)簡單動態字符串。算法

Redis除了字面量用的C語言的字符串變量,其他都是使用的SDS。數組

sds.h/sdshdr源碼:安全

struct sdshdr {

  //長度,爲字符數組長度-1
  int len;

  //分配待用的數組長度
  int free;

  //字節數組,爲了共用C語言的一些處理字符串的函數還在字符後加'\0'
  char buf[];
}

 

對比C語言字符串的優點:函數

  1. 常數複雜度獲取字符串長度
  2. 杜絕緩衝區溢出
  3. 減小修改字符串長度時須要的內存重分配次數
  4. 二進制安全
  5. 兼容部分C字符串函數

 

常數複雜度獲取字符串長度code

C字符串要得到長度須要遍歷整個字符串數組,複雜度O(N),而SDS結構中的len能夠直接獲取當前字符串長度,複雜度O(1)。內存

杜絕緩衝區溢出字符串

C字符串當須要拼接字符串,若是不從新分配內存,拼接後可能會覆蓋連續內存的值形成緩衝區溢出,而SDS經過free記錄的安全已分配空閒空間的數組長度,若是要拼接的字符串長度大於free,會先從新奉陪空間再憑藉。源碼

分配規則以下:class

  1. 當len長度小於1MB,再分配len大小的數組空間
  2. 當len長度大於等於1MB,再分配1MB大小數組空間

減小修改字符串長度時須要的內存重分配次數變量

C字符串每次修改都須要執行重分配內存,如拼接以前不執行重分配內存會產生緩衝區溢出,縮短字符串以前不自信重分配內存會產生內存泄漏。而內存重分配涉及算法浮渣,且可能須要執行系統調用,因此一般比較耗時,因此若是直接使用C語言做爲Redis字符串結構顯然不理想。

而SDS的free空間減小了內存重分配次數。

二進制安全

SDS使用char數組存儲二進制數據,因此二進制安全。

兼容部分C字符串函數

SDS數組會在數據的後面加一個'\0'表示字符串的結束,'/0'用戶不感知,也不會反應在len長度中,這樣作是爲了與C字符串保持統一,兼容部分C字符串函數。

相關文章
相關標籤/搜索