ziplist 壓縮列表
- 壓縮列表是一塊連續的,無間隙的內存空間;爲節約內存使用空間而設計的結構。
列表鍵和哈希鍵的底層實現之一 - 結構
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 字段的尾部了。 }
- 增加元素需要調用 realloc 擴展內存,可能會分配新的內存地址。 所以不適合存儲大型字符串,元素也不能太多。(重新分配內存和拷貝內存會有很大的消耗)
- 對元素進行更新時,如果 entry 中的 content 字節發生變化,如由254字節變成253字節,那麼這個 entry 內容的修改就會導致後續所有 entry 的級聯更新,這就是一個比較耗費計算資源的操作。(因爲是緊湊的聯繫的內存空間,刪除也會有這樣的後果)