redis資料結構實作--壓縮清單(ziplist)
壓縮清單(ziplist)是連結清單鍵和哈希鍵的底層實作之一。當連結清單鍵或哈希鍵隻有少量清單項,且清單項中是小整數值或短字元串,則會采用壓縮清單作為底層實作。
6.1 壓縮清單的實作
壓縮清單是為了節約記憶體而開發的,由一系列特殊編碼的連續記憶體塊組成的順序型資料結構。
一個壓縮清單可以包含任意多個節點(entry),每個節點儲存一個位元組數組或一個整數值。
壓縮清單的各個組成部分:

壓縮清單各個組成部分的詳細說明
6.2 壓縮清單節點構成
壓縮清單節點各個組成部分
詳解各個組成部分:
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負責儲存節點的值,可以儲存一個整數值或者一個位元組數組。