1. 程式人生 > 程式設計 >Redis 原始碼學習-Simple Dynamic String

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屬性來記錄當前字串長度。