天天看點

redis資料結構實作--壓縮清單(ziplist)

redis資料結構實作--壓縮清單(ziplist)

壓縮清單(ziplist)是連結清單鍵和哈希鍵的底層實作之一。當連結清單鍵或哈希鍵隻有少量清單項,且清單項中是小整數值或短字元串,則會采用壓縮清單作為底層實作。

6.1 壓縮清單的實作

壓縮清單是為了節約記憶體而開發的,由一系列特殊編碼的連續記憶體塊組成的順序型資料結構。

一個壓縮清單可以包含任意多個節點(entry),每個節點儲存一個位元組數組或一個整數值。

壓縮清單的各個組成部分:

redis資料結構實作--壓縮清單(ziplist)
壓縮清單各個組成部分的詳細說明
redis資料結構實作--壓縮清單(ziplist)

6.2 壓縮清單節點構成

壓縮清單節點各個組成部分

redis資料結構實作--壓縮清單(ziplist)

詳解各個組成部分:

6.2.1 previous_entry_length

previous_entry_length以位元組為機關,記錄了壓縮清單中前一個位元組的長度,該屬性長度可為1位元組或者5位元組。

  • [x] 如果前一節點長度小于254位元組,那麼previous_entry_length長度為1位元組,:前一節點的長度就儲存在這一個位元組裡面;
  • [x] 如果前一節點長度大于254位元組,那麼previous_entry_length長度為5位元組,其中previous_entry_length的第一位元組會被設定為0xFE(十進制254),而之後的四位元組儲存前一節點的長度。

因為previous_entry_length記錄了前一個節點的長度,可以通過目前節點的起始位址計算出前一個節點的起始位址,這也是壓縮清單從表尾向表頭的實作原理

6.2.2 encoding

記錄了content中儲存的類型與長度

  • [x] 一位元組、兩位元組或者五位元組長,值最高位為00、01、或者10是位元組數組編碼:這種編碼表示節點的content屬性儲存着位元組數組,數組長度由編碼去掉最高兩位的其他位錄。
  • [x] 一位元組長,值的最高位為11的是整數編碼:這種編碼表示content儲存的是整數值,整數值類型和長度由編碼去除最高兩位的其他位記錄。
6.2.3 content

content負責儲存節點的值,可以儲存一個整數值或者一個位元組數組。

繼續閱讀