[redis] 數據結構 -- 壓縮列表

ziplist 壓縮列表

  1. 壓縮列表是一塊連續的,無間隙的內存空間;爲節約內存使用空間而設計的結構。
    列表鍵和哈希鍵的底層實現之一
  2. 結構
    struct ziplist <T> {
        int32 zlbytes;           // 整個壓縮列表佔用字節數
        int32 zltail_offset; // 最後一個元素距離壓縮列表起始位置的偏移量,用於快速定位到最後一個節點,爲支持雙向遍歷而設計
        int16 zllength;        // 元素個數
        T[] entries;              // 元素內容列表,挨個緊湊存儲,內容稱爲 entry 塊
        int8 zlend;              // 標誌壓縮列表的結束,值恆爲 0xFF
    }
    // entries 中的 entry 塊結構爲
    struct entry {
        int<var> prevlen;                // 前一個 entry 的字節長度,可以用來定位前一個 entry 的位置(倒遍歷)
                                                           // content 的長度 ≥ 254 位,prevlen 用 5 字節表示,content 長度 < 254 位時,prevlen 用 1 字節表示
        int<var> encoding;            // 元素類型編碼,ziplist 通過這個字段來決定後面的 content 內容的形式
        optional byte[] content; // 元素內容,可選字段,對於很小的整數而言,它的內容已經內聯到 encoding 字段的尾部了。
    }
    
  3. 增加元素需要調用 realloc 擴展內存,可能會分配新的內存地址。 所以不適合存儲大型字符串,元素也不能太多。(重新分配內存和拷貝內存會有很大的消耗)
  4. 對元素進行更新時,如果 entry 中的 content 字節發生變化,如由254字節變成253字節,那麼這個 entry 內容的修改就會導致後續所有 entry 的級聯更新,這就是一個比較耗費計算資源的操作。(因爲是緊湊的聯繫的內存空間,刪除也會有這樣的後果)
發佈了53 篇原創文章 · 獲贊 9 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章