Redis 壓縮列表的構(gòu)成

2018-08-02 14:47 更新

壓縮列表是 Redis 為了節(jié)約內(nèi)存而開發(fā)的, 由一系列特殊編碼的連續(xù)內(nèi)存塊組成的順序型(sequential)數(shù)據(jù)結(jié)構(gòu)。

一個壓縮列表可以包含任意多個節(jié)點(diǎn)(entry), 每個節(jié)點(diǎn)可以保存一個字節(jié)數(shù)組或者一個整數(shù)值。

圖 7-1 展示了壓縮列表的各個組成部分, 表 7-1 則記錄了各個組成部分的類型、長度、以及用途。


表 7-1 壓縮列表各個組成部分的詳細(xì)說明

屬性 類型 長度 用途
zlbytes uint32_t 4 字節(jié) 記錄整個壓縮列表占用的內(nèi)存字節(jié)數(shù):在對壓縮列表進(jìn)行內(nèi)存重分配, 或者計(jì)算 zlend 的位置時使用。
zltail uint32_t 4 字節(jié) 記錄壓縮列表表尾節(jié)點(diǎn)距離壓縮列表的起始地址有多少字節(jié): 通過這個偏移量,程序無須遍歷整個壓縮列表就可以確定表尾節(jié)點(diǎn)的地址。
zllen uint16_t 2 字節(jié) 記錄了壓縮列表包含的節(jié)點(diǎn)數(shù)量: 當(dāng)這個屬性的值小于 UINT16_MAX (65535)時, 這個屬性的值就是壓縮列表包含節(jié)點(diǎn)的數(shù)量; 當(dāng)這個值等于 UINT16_MAX 時, 節(jié)點(diǎn)的真實(shí)數(shù)量需要遍歷整個壓縮列表才能計(jì)算得出。
entryX 列表節(jié)點(diǎn) 不定 壓縮列表包含的各個節(jié)點(diǎn),節(jié)點(diǎn)的長度由節(jié)點(diǎn)保存的內(nèi)容決定。
zlend uint8_t 1 字節(jié) 特殊值 0xFF (十進(jìn)制 255 ),用于標(biāo)記壓縮列表的末端。

圖 7-2 展示了一個壓縮列表示例:

  • 列表 zlbytes 屬性的值為 0x50 (十進(jìn)制 80), 表示壓縮列表的總長為 80 字節(jié)。
  • 列表 zltail 屬性的值為 0x3c (十進(jìn)制 60), 這表示如果我們有一個指向壓縮列表起始地址的指針 p , 那么只要用指針 p 加上偏移量 60 , 就可以計(jì)算出表尾節(jié)點(diǎn) entry3 的地址。
  • 列表 zllen 屬性的值為 0x3 (十進(jìn)制 3), 表示壓縮列表包含三個節(jié)點(diǎn)。

圖 7-3 展示了另一個壓縮列表示例:

  • 列表 zlbytes 屬性的值為 0xd2 (十進(jìn)制 210), 表示壓縮列表的總長為 210 字節(jié)。
  • 列表 zltail 屬性的值為 0xb3 (十進(jìn)制 179), 這表示如果我們有一個指向壓縮列表起始地址的指針 p , 那么只要用指針 p 加上偏移量 179 , 就可以計(jì)算出表尾節(jié)點(diǎn) entry5 的地址。
  • 列表 zllen 屬性的值為 0x5 (十進(jìn)制 5), 表示壓縮列表包含五個節(jié)點(diǎn)。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號