簡單動態字符串
- Redis構建了一種名爲簡單動態字符串(simple dynamic string, SDS)的抽象類型,作爲默認字符串表示。
- SDS遵循C字符串以空字符結尾的慣例,保存空字符的一個字節空間不計算在SDS的len屬性裏面,並且爲空字符分配額外的一個字節,以及添加空字符到字符串末尾等操作,都是由SDS函數自動完成的,所以空字符對SDS的使用者來說是完全透明的。
struct sdshr {
// 記錄buf數組中已使用字節的數量
// 等於sds所保存字符串的長度
int len;
// 記錄buf數組中未使用字節的數量
int free;
// 字節數組,用戶保存字符串
char buf[];
};
C字符串 |
SDS |
獲取字符串長度的時間複雜度爲O(n) |
獲取字符串長度的時間複雜度爲O(1) |
API 是不安全的,可能會造成緩衝區溢出 |
API 是安全的,不會造成緩衝區溢出 |
修改字符串長度N次必然需要執行N次內存重分配 |
修改字符串長度N次最多需要執行N次內存重分配(預分配和惰性釋放) |
只能保存文本數據 |
可以保存文本或者二進制數據(二進制安全) |
可以使用所有<string.>庫中的函數 |
可以使用部分<string.>庫中的函數 |
- SDS的預分配策略
- 如果對SDS進行修改後,SDS的長度(也就是len屬性的值)小於1MB,那麼程序分配和len屬性同樣大小的未使用空間。
- 如果對SDS進行修改後,SDS的長度將大於等於1MB,那麼程序會分配1MB的未使用空間
- SDS的API都是二進制安全的,以處理二進制的方式來處理SDS存放在buf數組裏的數據,程序不會對其中的數據做任何限制、過濾或者假設,數據在寫入時是什麼樣子,讀取時就是什麼樣子