SDS(Simple Dynamic String)簡單動態字符串。算法
Redis除了字面量用的C語言的字符串變量,其他都是使用的SDS。數組
sds.h/sdshdr源碼:安全
struct sdshdr { //長度,爲字符數組長度-1 int len; //分配待用的數組長度 int free; //字節數組,爲了共用C語言的一些處理字符串的函數還在字符後加'\0' char buf[]; }
對比C語言字符串的優點:函數
常數複雜度獲取字符串長度code
C字符串要得到長度須要遍歷整個字符串數組,複雜度O(N),而SDS結構中的len能夠直接獲取當前字符串長度,複雜度O(1)。內存
杜絕緩衝區溢出字符串
C字符串當須要拼接字符串,若是不從新分配內存,拼接後可能會覆蓋連續內存的值形成緩衝區溢出,而SDS經過free記錄的安全已分配空閒空間的數組長度,若是要拼接的字符串長度大於free,會先從新奉陪空間再憑藉。源碼
分配規則以下:class
減小修改字符串長度時須要的內存重分配次數變量
C字符串每次修改都須要執行重分配內存,如拼接以前不執行重分配內存會產生緩衝區溢出,縮短字符串以前不自信重分配內存會產生內存泄漏。而內存重分配涉及算法浮渣,且可能須要執行系統調用,因此一般比較耗時,因此若是直接使用C語言做爲Redis字符串結構顯然不理想。
而SDS的free空間減小了內存重分配次數。
二進制安全
SDS使用char數組存儲二進制數據,因此二進制安全。
兼容部分C字符串函數
SDS數組會在數據的後面加一個'\0'表示字符串的結束,'/0'用戶不感知,也不會反應在len長度中,這樣作是爲了與C字符串保持統一,兼容部分C字符串函數。