redis沒有使用c的字符串,而是本身構建了sds,可是爲了重用c字符串的不少方法,sds跟c同樣最後一個字節保存一個空字符‘\0’redis
sds與c字符串的主要區別緩存
一、c獲取字符串長度的複查度是o(N),而sds是o(1),sds的長度動態記錄在len中安全
二、緩存區溢出,c字符串不記錄自身長度,在字符串合併時可能會形成緩衝區溢出,sds在字符串拼接時候,會檢查空間時候足夠,若是不足,會先擴容,而後才執行拼接操做函數
三、sds比起c字符串,減小字符串修改時內存的重分配次數,sds採用空間預分配和惰性空間釋放策略spa
3.1 空間預分配
視頻
當字符串增加時候,sds不只會分配增加須要的空間,還會額外分配未使用空間。修改後sds的長度(len)小於1MB,會額外分配 len 長度的空間;sds修改後的長度(len)大於1MB,會額外分配1MB空間圖片
3.2 惰性空間釋放
內存
當sds收縮時,並不會當即回收釋放的空間,而是使用free標記起來,等待未來使用字符串
四、二級制安全音頻
c字符串在讀到'\0'時候,就認爲是字符串結尾,這樣的限制使得c字符串自能保存文本數據,不能保存圖片,音頻,視頻等數據,而sds都會以處理二進制的方式來處理buf裏面的數據,數據寫進去是什麼樣,讀出來就是什麼樣
五、兼容c字符串函數
sds採用末尾保留'\0',就是爲了兼容c字符串