天天看點

Redis 源碼學習-Simple Dynamic String

Redis隻會使用C字元串作為字面量,在大多數情況下,Redis使用SDS作為字元串表示。

比起C字元串,SDS具有以下優點:

  1. 常數複雜度獲得字元串長度。
  2. 杜絕緩沖區溢出。
  3. 減少修改字元串長度時所需的記憶體重配置設定次數。
  4. 二進制安全。
  5. 相容部分C字元串函數。
資料結構
struct sdshdr {
    
    // buf 中已占用空間的長度
    int len;

    // buf 中剩餘可用空間的長度
    int free;

    // 資料空間
    char buf[];
};           
解析

len記錄buf數組中已使用位元組的數量,等于SDS所儲存的字段長度。free記錄buf數組中未使用位元組的數量。buf為字元串的資料空間,它的長度為len+free+1,因為它需要多存一個'0'作為結束辨別。

為什麼要多存'0'

C語言中的字元串為Null-terminated String,它用'0'來表示字元串的結束。并且除了字元串末尾之外,字元串内不能包含空字元,否則最先被讀到的空字元會被誤認為結束辨別。

這種存儲二進制和讀取不一緻的情況被稱為Binary Unsafe。為了實作二進制安全,redis采用len屬性來記錄目前字元串長度。

繼續閱讀