redis數據結構-簡單動態字符串(sds)

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字符串

相關文章
相關標籤/搜索