Redis設計與實現-02-數據結構與對象

簡單動態字符串

  • Redis構建了一種名爲簡單動態字符串(simple dynamic string, SDS)的抽象類型,作爲默認字符串表示。
    • SDS遵循C字符串以空字符結尾的慣例,保存空字符的一個字節空間不計算在SDS的len屬性裏面,並且爲空字符分配額外的一個字節,以及添加空字符到字符串末尾等操作,都是由SDS函數自動完成的,所以空字符對SDS的使用者來說是完全透明的。
struct sdshr {
    // 記錄buf數組中已使用字節的數量
    // 等於sds所保存字符串的長度
    int len;
    // 記錄buf數組中未使用字節的數量
    int free;
    // 字節數組,用戶保存字符串
    char buf[];
};
  • SDS與傳統C字符串的區別
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數組裏的數據,程序不會對其中的數據做任何限制、過濾或者假設,數據在寫入時是什麼樣子,讀取時就是什麼樣子
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章