redis 底層資料結構 壓縮列表 ziplist

2022-08-03 15:24:10 字數 1542 閱讀 1096

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

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

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

ziplist 資料結構

壓縮列表節點的構成

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

長度小於等於63位元組的位元組陣列

長度小於等於16383位元組的位元組陣列

長度小於等於4294967295位元組的位元組陣列

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

1:  4位長介於0至12之間的無符號整數

2:1位元組長的有符號整數

3: 3位元組長的有符號整數

4:int16型別整數

5:int32型別整數

6 : int64型別整數

壓縮列表的資料結構

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

如果前一節點的長度小於254位元組那麼previous_entry_length屬性的長度為1位元組 如果前一節點的長度大於等於254位元組previous_entry_length屬性的長度為5位元組

根據當前節點的位址和previous_entry_length的值來計算出前乙個節點的位址

壓縮列表的從表尾向表頭遍歷操作就是使用這一原理實現的,只要我們擁有了乙個指向某個節點起始位址的指標,那麼通過這個指標以及這個節點的previous_entry_length屬性

程式就可以一直向前乙個節點回溯,最終到達壓縮列表的表頭節點。

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

一位元組、兩位元組或者五位元組長,值的最高位為00 、01、或者10的是位元組陣列編碼這種編碼表示節點的content屬性儲存著位元組陣列,陣列的長度有編碼除去最高兩位之後的其他位記錄

一位元組長 值的最高位以11開頭的是整數編碼,這種編碼表示節點的content屬性儲存著整數值,整數值的型別和長度有編碼除去最高兩位之後的其他位記錄

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

連鎖更新

連鎖更新在最壞情況下需要對壓縮列表執行n次空間重分配操作,而每次空間重分配的最壞複雜度為o(n) 連鎖更新最壞的時間複雜度o(n*n)

lian

Redis 底層資料結構 壓縮列表

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

Redis底層資料結構 壓縮列表

redis 中的壓縮列表是由一系列特殊編碼的連續記憶體塊組成的順序型資料結構。列表中每個節點可以儲存乙個位元組陣列或者乙個整數值。它的存在主要是為了節約記憶體。壓縮列表在 redis 中主要作為了 list 列表和 hash 雜湊兩種資料結構的底層實現之一。在 list 列表中,要是列表中的儲存元素...

Redis底層資料結構 六 壓縮列表

壓縮列表 ziplist 是列表鍵和雜湊鍵的底層實現之一。當乙個列表鍵只包含少量列表項,並且每個列表項要麼是小整數值,要麼就是長度比較短的字串,redis就會使用壓縮列表來做列表鍵的底層實現。壓縮列表是redis為了節約記憶體而開發的,是由一系列編碼的聯絡記憶體塊組成的順序性資料結構。乙個壓縮列表可...