Redis 源碼學習-Simple Dynamic String

Redis只會使用C字符串做爲字面量,在大多數狀況下,Redis使用SDS做爲字符串表示。redis

比起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'來表示字符串的結束。而且除了字符串末尾以外,字符串內不能包含空字符,不然最早被讀到的空字符會被誤認爲結束標識。bash

這種存儲二進制和讀取不一致的狀況被稱爲Binary Unsafe。爲了實現二進制安全,redis採用len屬性來記錄當前字符串長度。數據結構

相關文章
相關標籤/搜索