Redis中的壓縮列表

2021-07-11 05:22:02 字數 2683 閱讀 7243

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

例如,執行以下命令將建立乙個壓縮列表實現的列表鍵:

127.0

.0.1:6379> rpush 1st 135

10086

"hello"

"world"

(integer) 6

127.0

.0.1:6379> object encoding 1st

"ziplist"

列表鍵裡包含的都是1、3、5、10086這樣的小整數值,以及hello、world這樣的短字串。

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

舉個例子,執行以下命令將建立乙個壓縮列表實現的雜湊鍵:

127.0

.0.1:6379> hmset profile name jack age 28 job programmer

ok127.0

.0.1:6379> object encoding profile

"ziplist"

雜湊鍵裡面包含的所有鍵和值都是小整數值或者短字串。

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

下圖展示了壓縮列表的各個組成部分:

下表則記錄了各個組成部分的型別、長度以及用途:

觀察下面給出的壓縮列表示例:

再觀察另乙個壓縮列表示例:

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

而整數值則可以是以下六種長度的其中一種:

每個壓縮列表節點都由previous_entry_length、encoding、content三個部分組成:

previous_entry_length

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

下圖展示了乙個包含一位元組長previous_entry_length屬性的壓縮列表節點,屬性值為0x05,表示前一節點的長度為5位元組。

下圖展示了乙個包含五位元組長previous_entry_length屬性的壓縮節點,屬性的值為0xfe00002766,其中值的最高位位元組0xfe表示這是乙個五位元組長的previous_entry_length屬性,而之後的四位元組0x00002766(十進位制10086)才是前一位元組的實際長度。

因為節點的previous_entry_length屬性記錄了前乙個節點的長度,所以程式可以通過指標運算,根據當前節點的起始位址來計算出前一節點的起始位址。

舉個例子,如果我們有乙個指向當前節點起始位址的指標c,那麼我們只要用指標c減去當前節點previous_entry_length屬性的值,就可以得出乙個指向前乙個節點起始位址的指標p,如下圖所示:

壓縮列表的從表尾向表頭遍歷操作就是使用這一原理實現的,只要我們擁有乙個指向某個節點起始位址的指標,那麼通過這個指標以及這個節點的previous_entry_length屬性,程式就可以一直向前乙個節點回溯,最終到達壓縮列表的表頭節點。

encoding

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

下表記錄了所有可用的整數編碼:

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

下圖展示了乙個儲存位元組陣列的節點示例:

下圖展示了乙個儲存著整數值的節點示例:

Redis中的壓縮列表

壓縮列表 ziplist 是列表鍵和雜湊鍵的底層實現之一。當乙個列表鍵只包含少量列表項,並且每個列表項要麼就是小整數值,要麼就是長度比較短的字串,那麼redis就會使用壓縮列表來做列表鍵的底層實現。例如,執行以下命令將建立乙個壓縮列表實現的列表鍵 127.0.0.1 6379 rpush 1st 1...

redis 壓縮列表

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

Redis之壓縮列表

壓縮列表 ziplist 是列表鍵和雜湊鍵的底層實現之一。當乙個列表鍵只包含少量列表項,並且每個列表項要麼就是小整數值,要麼就是長度比較短的字串,redis就會使用壓縮列表來做列表鍵的底層實現。下面看一下壓縮列表實現的列表鍵 列表鍵裡面包含的都是1 3 5 10086這樣的小整數值,以及 hello...