SDS 簡單動態字符串。數組
SDS的結構:安全
struct sdshdr{ int len;//記錄BUF數組中已使用字節的數量 ,等於SDS所八寸字符串的長度 int free;//記錄BUF數組中未使用字節的數量 char buf[];//字節數組,用於保存字符串 }
一、與c語言的字符串相比,SDS獲取長度時,時間複雜度位O(1),c的複雜度位O(n)。spa
二、杜絕緩衝區溢出,c字符串若未從新分配內存,在進行字符串拼接時,會致使擴展字符串s1的數據溢出到s2所在的空間,致使s2所保存的內容被意外修改(緩衝區溢出)。code
三、杜絕內存泄漏,若裁剪字符串,若未從新分配內存,則會形成內存泄露。blog
四、對於SDS來講,若是擴展,則SDS API 會檢查空間是否足夠,若是足夠則直接使用未使用的空間,無需從新分配。惰性釋放空間,SDS須要縮短時,程序不會當即從新分配內存,而是使用free記錄這些多餘的空間,等待未來使用。內存
五、SDS的API都是使用二進制安全的,全部的SDS API都會以處理二進制的方式處理SDS存放在buf數組中的數據,程序不會對其中的數據作任何限制、過濾、或者假設,因此Redis不是用數組保存字符串,而是用它來保存一系列的二進制數據。字符串