壓縮列表是 Redis 為了節約內存而開發的, 由一系列特殊編碼的連續內存塊組成的順序型(sequential)數據結構。
一個壓縮列表可以包含任意多個節點(entry), 每個節點可以保存一個字節數組或者一個整數值。
圖 7-1 展示了壓縮列表的各個組成部分, 表 7-1 則記錄了各個組成部分的類型、長度、以及用途。

* * *
表 7-1 壓縮列表各個組成部分的詳細說明
| 屬性 | 類型 | 長度 | 用途 |
| --- | --- | --- | --- |
| `zlbytes` | `uint32_t` | `4`?字節 | 記錄整個壓縮列表占用的內存字節數:在對壓縮列表進行內存重分配, 或者計算?`zlend`?的位置時使用。 |
| `zltail` | `uint32_t` | `4`?字節 | 記錄壓縮列表表尾節點距離壓縮列表的起始地址有多少字節: 通過這個偏移量,程序無須遍歷整個壓縮列表就可以確定表尾節點的地址。 |
| `zllen` | `uint16_t` | `2`?字節 | 記錄了壓縮列表包含的節點數量: 當這個屬性的值小于?`UINT16_MAX`?(`65535`)時, 這個屬性的值就是壓縮列表包含節點的數量; 當這個值等于?`UINT16_MAX`?時, 節點的真實數量需要遍歷整個壓縮列表才能計算得出。 |
| `entryX` | 列表節點 | 不定 | 壓縮列表包含的各個節點,節點的長度由節點保存的內容決定。 |
| `zlend` | `uint8_t` | `1`?字節 | 特殊值?`0xFF`?(十進制?`255`?),用于標記壓縮列表的末端。 |
* * *
圖 7-2 展示了一個壓縮列表示例:
* 列表?`zlbytes`?屬性的值為?`0x50`?(十進制?`80`), 表示壓縮列表的總長為?`80`?字節。
* 列表?`zltail`?屬性的值為?`0x3c`?(十進制?`60`), 這表示如果我們有一個指向壓縮列表起始地址的指針?`p`?, 那么只要用指針?`p`?加上偏移量?`60`?, 就可以計算出表尾節點?`entry3`?的地址。
* 列表?`zllen`?屬性的值為?`0x3`?(十進制?`3`), 表示壓縮列表包含三個節點。

圖 7-3 展示了另一個壓縮列表示例:
* 列表?`zlbytes`?屬性的值為?`0xd2`?(十進制?`210`), 表示壓縮列表的總長為?`210`?字節。
* 列表?`zltail`?屬性的值為?`0xb3`?(十進制?`179`), 這表示如果我們有一個指向壓縮列表起始地址的指針?`p`?, 那么只要用指針?`p`?加上偏移量?`179`?, 就可以計算出表尾節點?`entry5`?的地址。
* 列表?`zllen`?屬性的值為?`0x5`?(十進制?`5`), 表示壓縮列表包含五個節點。

- 介紹
- 前言
- 致謝
- 簡介
- 第一部分:數據結構與對象
- 簡單動態字符串
- SDS 的定義
- SDS 與 C 字符串的區別
- SDS API
- 重點回顧
- 參考資料
- 鏈表
- 鏈表和鏈表節點的實現
- 鏈表和鏈表節點的 API
- 重點回顧
- 字典
- 字典的實現
- 哈希算法
- 解決鍵沖突
- rehash
- 漸進式 rehash
- 字典 API
- 重點回顧
- 跳躍表
- 跳躍表的實現
- 跳躍表 API
- 重點回顧
- 整數集合
- 整數集合的實現
- 升級
- 升級的好處
- 降級
- 整數集合 API
- 重點回顧
- 壓縮列表
- 壓縮列表的構成
- 壓縮列表節點的構成
- 連鎖更新
- 壓縮列表 API
- 重點回顧
- 對象
- 對象的類型與編碼
- 字符串對象
- 列表對象
- 哈希對象
- 集合對象
- 有序集合對象
- 類型檢查與命令多態
- 內存回收
- 對象共享
- 對象的空轉時長
- 重點回顧
- 第二部分:單機數據庫的實現
- 數據庫
- 數據庫鍵空間
- 重點回顧
- RDB 持久化
- RDB 文件結構
- 重點回顧
- AOF 持久化
- AOF 持久化的實現
- 重點回顧
- 事件
- 文件事件
- 重點回顧
- 參考資料
- 客戶端
- 客戶端屬性
- 重點回顧
- 服務器
- 命令請求的執行過程
- 重點回顧
- 第三部分:多機數據庫的實現
- 復制
- 舊版復制功能的實現
- 重點回顧
- Sentinel
- 啟動并初始化 Sentinel
- 重點回顧
- 參考資料
- 集群
- 節點
- 重點回顧
- 第四部分:獨立功能的實現
- 發布與訂閱
- 頻道的訂閱與退訂
- 重點回顧
- 參考資料
- 事務
- 事務的實現
- 重點回顧
- Lua 腳本
- 創建并修改 Lua 環境
- 重點回顧
- 排序
- SORT <key> 命令的實現
- 重點回顧
- 二進制位數組
- GETBIT 命令的實現
- 重點回顧
- 慢查詢日志
- 慢查詢記錄的保存
- 慢查詢日志的閱覽和刪除
- 添加新日志
- 重點回顧
- 監視器
- 成為監視器
- 向監視器發送命令信息
- 重點回顧
- 源碼、相關資源和勘誤