Redis資料結構 壓縮列表

2021-10-09 14:05:31 字數 2444 閱讀 2186

同整數集合一樣壓縮列表也不是基礎資料結構,而是 redis 自己設計的一種資料儲存結構。它有點兒類似陣列,通過一片連續的記憶體空間,來儲存資料。不過,它跟陣列不同的一點是,它允許儲存的資料大小不同。

聽到「壓縮」兩個字,直觀的反應就是節省記憶體。之所以說這種儲存結構節省記憶體,是相較於陣列的儲存思路而言的。我們知道,陣列要求每個元素的大小相同,如果我們要儲存不同長度的字串,那我們就需要用最大長度的字串大小作為元素的大小(假設是20個位元組)。儲存小於 20 個位元組長度的字串的時候,便會浪費部分儲存空間。

陣列的優勢占用一片連續的空間可以很好的利用cpu快取訪問資料。如果我們想要保留這種優勢,又想節省儲存空間我們可以對陣列進行壓縮。

但是這樣有乙個問題,我們在遍歷它的時候由於不知道每個元素的大小是多少,因此也就無法計算出下乙個節點的具體位置。這個時候我們可以給每個節點增加乙個lenght的屬性。

如此。我們在遍歷節點的之後就知道每個節點的長度(占用記憶體的大小),就可以很容易計算出下乙個節點再記憶體中的位置。這種結構就像乙個簡單的壓縮列表了。

壓縮列表(zip1ist)是列表和雜湊的底層實現之一。

當乙個列表只包含少量列表項,並且每個列表項要麼就是小整數值,要麼就是長度比較短的字串,那麼redis就會使用壓縮列表來做列表的底層實現。

當乙個雜湊只包含少量鍵值對,比且每個鍵值對的鍵和值要麼就是小整數值,要麼就是長度比較短的字串,那麼redis就會使用壓縮列表來做雜湊的底層實現。

2.1 redis壓縮列表的構成

壓縮列表是redis為了節約記憶體而開發的,是由一系列特殊編碼的連續記憶體塊組成的順序型(sequential)資料結枃。乙個壓縮列表可以包含任意多個節點(entry),每個節點可以儲存乙個位元組陣列或者乙個整數值,如下圖。

示例:

如上圖,展示了乙個總長為80位元組,包含3個節點的壓縮列表。如果我們有乙個指向壓縮列表起始位址的指標p,那麼表為節點的位址就是p+60。

2.2 redis壓縮列表節點的構成

每個壓縮列表節點可以儲存乙個位元組陣列或者乙個整數值。其中,位元組陣列可以是以下三種長度中的一種。

整數值可以是以下6種長度中的一種

節點的 previous_entry_length屬性以位元組為單位,記錄了壓縮列表中前乙個節點的長度。 previous_entry_length屬性的長度可以是1位元組或者5位元組。

節點的encoding屬性記錄了節點的content屬性所儲存資料的型別以及長度。

節點的content屬性負責儲存節點的值,節點值可以是乙個位元組陣列或者整數,值的型別和長度由節點的encoding屬性決定。

2.3 常用操作的時間複雜度

操作時間複雜度

建立乙個新的壓縮列表

o(1)

建立乙個包含給定值的新節點,並將這個新節點新增到壓縮列表的表頭或者表尾

平均o(n),最壞o(n^2)(可能發生連鎖更新)

將包含給定值的新節點插人到給定節點之後

平均o(n),最壞o(n^2)(可能發生連鎖更新)

返回壓縮列表給定索引上的節點

o(n)

在壓縮列表中查詢並返回包含了給定值的節點

因為節點的值可能是乙個位元組陣列,所以檢查節點值和給定值是否相同的複雜度為o(n),而查詢整個列表的複雜度則為(n^2)

返回給定節點的下乙個節點

o(1)

返回給定節點的前乙個節點

o(1)

獲取給定節點所儲存的值

o(1)

從壓縮列表中刪除給定的節點

平均o(n),最壞o(n^2)(可能發生連鎖更新)

刪除壓縮列表在給定索引上的連續多個

平均o(n),最壞o(n^2)(可能發生連鎖更新)

返回壓縮列表目前占用的記憶體位元組數

o(1)

返回壓縮列表目前包含的節點數量

點數量小於65535時為o(1),大於65535時為o(n)

《redis設計與實現》

《redis開發與運維》

《redis官方文件》

redis資料結構 壓縮列表

但凡是名稱中有 壓縮 兩個字的,都是為了節約記憶體。壓縮列表也不例外。以下是壓縮列表的結構圖 zlbytes zltail zllen entry1 entry2 entryn zlend 說明 屬性 型別長度 用途zlbytes unit32 t 4bit 記錄整個ziplist占用的記憶體位元組...

redis資料結構 壓縮列表

壓縮列表是 redis 為了節約記憶體而開發的。乙個壓縮列表可以包含任意多個節點,每個節點可以儲存乙個位元組陣列或者乙個整數值。當乙個列表鍵只包含少量列表項,並且每個列表項要麼就是小整數值,要麼就是長度比較短的字串,那麼 redis 就會使用壓縮列表來做列表鍵的底層實現。在乙個壓縮列表中,有多個連續...

Redis 資料結構之 壓縮列表

壓縮列表是一塊連續的記憶體空間,元素之間緊挨著儲存,沒有任何冗餘空隙。struct ziplist entry 塊隨著容納的元素型別不同,也會有不一樣的結構。struct entry encoding 字段儲存了元素內容的編碼型別資訊,ziplist 通過這個欄位來決定後面的 content 內容的...