壓縮列表(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...