1. 程式人生 > 其它 >快速整透Redis中的壓縮列表到底是個啥

快速整透Redis中的壓縮列表到底是個啥

壓縮列表簡介

壓縮列表(ziplist)是由一個連續記憶體組成的順序型資料結構。一個壓縮列表可以包含任意多個節點,每個節點上可以儲存一個位元組陣列或整數值。它是Redis為了節省記憶體空間而開發的。

壓縮列表(ziplist)是雜湊(hash)和有序集合(zset)的內部編碼之一。當雜湊(hash)中的元素個數比較少並且每個元素的值佔用空間比較小的時候,Redis就會使用壓縮列表做為雜湊的內部編碼。當有序集合(zset)中的元素個數比較少並且每個元素的值佔用空間比較小的時候,Redis也會使用壓縮列表做為有序集合的內部編碼。

壓縮列表結構

接下來,我們來看以下壓縮列表的內部構造,壓縮列表由以下幾個部分組成:

  • zlbytes:表示整個壓縮列表佔用的記憶體位元組數。
  • xltail:表示壓縮列表起始地址到最後一個節點的位元組數,可以快速找到最後一個節點。
  • zllength:表示壓縮列表包含的節點個數。
  • entries:節點列表,一個挨著一個地緊湊儲存。
  • zlend:特殊值0xFF(十進位制為255),表示壓縮列表的結束。

壓縮列表節點結構

每個壓縮列表的節點由三部分組成: prevlenencodingcontent

prevlen

prevlen:表示該節點前一個節點的位元組長度。 prevlen的長度可能是1個位元組,也可能是5個位元組。

當前一個節點的長度小於254個位元組時, prevlen

的長度為1個位元組,直接儲存前一個節點的位元組長度;

當前一個節點的長度大於或等於254個位元組時, prevlen的長度為5個位元組,其中的第一個位元組被設定為0xFE,隨後的四個位元組儲存前一個節點的位元組長度。

可以通過 prevlen和壓縮列表結構中的xltail逆序遍歷壓縮列表。

encoding

encoding表示該節點中儲存資料的型別和長度。

encoding的最高位以00開頭時,表示最大長度為63的短字串,此時encoding的長度為1個位元組,其後面6個位表示字串的位元組長度;

encoding的最高位以01開頭時,表示最大長度為16383的中等長度的字串,此時encoding

的長度為2個位元組,其後面14個位表示字串的位元組長度;

encoding的最高位以10開頭時,表示最大長度為4294967295的特長的字串,此時encoding的長度為5個位元組,其後面4個位元組表示字串的位元組長度;

encoding的最高位以11開頭時,表示整數值,此時encoding的長度為1個位元組,其後面6個位表示整數值的型別和長度。

content

content用於儲存節點的值,節點的值可以是一個位元組陣列,也可以是正數,其型別和長度由encoding決定。

總結

壓縮列表(ziplist)是由一個連續記憶體組成的順序型資料結構。

一個壓縮列表可以包含任意多個節點,每個節點上可以儲存一個位元組陣列或整數值。

壓縮列表(ziplist)是雜湊(hash)和有序集合(zset)的內部編碼之一。


竟然已經看到這裡了,你我定是有緣人,留下你的點贊關注,他日必成大器。

微信公眾號:萬貓學社

微信掃描二維碼

關注後回覆「電子書」

獲取12本Java必讀技術書籍