快速整透Redis中的壓縮列表到底是個啥
- 2022 年 3 月 10 日
- 筆記
壓縮列表簡介
壓縮列表(ziplist)是由一個連續內存組成的順序型數據結構。一個壓縮列表可以包含任意多個節點,每個節點上可以保存一個位元組數組或整數值。它是Redis為了節省內存空間而開發的。
壓縮列表(ziplist)是哈希(hash)和有序集合(zset)的內部編碼之一。當哈希(hash)中的元素個數比較少並且每個元素的值佔用空間比較小的時候,Redis就會使用壓縮列表做為哈希的內部編碼。當有序集合(zset)中的元素個數比較少並且每個元素的值佔用空間比較小的時候,Redis也會使用壓縮列表做為有序集合的內部編碼。
壓縮列表結構
接下來,我們來看以下壓縮列表的內部構造,壓縮列表由以下幾個部分組成:
zlbytes
:表示整個壓縮列表佔用的內存位元組數。xltail
:表示壓縮列表起始地址到最後一個節點的位元組數,可以快速找到最後一個節點。zllength
:表示壓縮列表包含的節點個數。entries
:節點列表,一個挨着一個地緊湊存儲。zlend
:特殊值0xFF(十進制為255),表示壓縮列表的結束。
壓縮列表節點結構
每個壓縮列表的節點由三部分組成: prevlen
、 encoding
和content
。
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必讀技術書籍
