Redis 數據結構之SDS

Redis 沒有直接使用C語言傳統的字符串表示,而是本身構建了一種名爲簡單動態字符(SDS)串的數據結構數組

一 SDS 的定義數據結構

struct{內存

int len;  // 記錄buf數組中已使用的字節數量                                                                字符串

int free; // 記錄buf數組中未使用的字節數量           遍歷

char buf[]  ;                                                  程序

  }      im

                                                                                               

free 屬性  的值爲0,表示這個SDS沒有分配任何未使用的空間數據

len 屬性的值爲5,表示這個SDS 保存了一個5字節長的字符串img

看下圖語言

   

                                  

free 屬性  的值爲2,表示這個SDS分配2個未使用的空間                                                          

           

二  SDS 與 C字符串的區別

    1  獲取字符串的長度

          SDS 根據 len 便可獲取

          C 字符串 須要遍歷數組 直到遇到 \0

    2 杜絕緩衝區溢出

       SDS 的空間分配策略徹底杜絕了發生緩衝區溢出的可能性。

         SDS 的空間分配策略

         (1)對SDS進行修改以後,若是SDS的len小於1MB,那麼程序分配和len 屬性一樣大小的未使用空間

           例如 len = 13,SDS的buf數組實際長度將變成13+13+1=27(\0) 字節 。

          (2) 若是對SDS的修改以後,SDS的長度大於  1MB ,那麼程序會分配1MB 的未使用空間 。

           例如 len =20MB ,SDS 的buf數組的長度爲 20MB+1MB+1byte。       

   3 惰性釋放空間

        惰性釋放空間用於 SDS的字符串縮短操做:當SDS的API 須要縮短SDS的字符串時,程序並不當即使用內存重分配來回收縮短多出來的字節。而是用free屬性講這些字節記錄起來。                         

相關文章
相關標籤/搜索