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