壓縮串列簡介
壓縮串列(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必讀技術書籍
作者:萬貓學社
出處:http://www.cnblogs.com/heihaozi/
著作權宣告:本文遵循 CC 4.0 BY-NC-SA 著作權協議,轉載請附上原文出處鏈接和本宣告,
微信掃描二維碼,關注萬貓學社,回復「電子書」,免費獲取12本Java必讀技術書籍,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/440359.html
標籤:Java
上一篇:Spring入門筆記簡要
