壓縮列表(ziplist)是列表鍵和哈希鍵的底層實(shí)現(xiàn)之一。當(dāng)一個(gè)列表鍵只包含少量列表項(xiàng),并且每個(gè)列表項(xiàng)要么就是小整數(shù)值,要么就是長度比較短的字符串,那么redis就會使用壓縮列表來做列表建的底層實(shí)現(xiàn)。
壓縮列表的結(jié)構(gòu)
| zlbytes | zltail | zllen | entry1 | entry2 | ... | entryN | zlend |
|---|
| 屬性 | 類型 | 長度 | 用途 |
|---|---|---|---|
| zlbytes | uint32_t | 4字節(jié) | 記錄整個(gè)壓縮列表占用的內(nèi)存字節(jié)數(shù):在對壓縮列表進(jìn)行內(nèi)存重分配,或者計(jì)算zlend的位置時(shí)使用 |
| zltail | uint32_t | 4字節(jié) | 記錄壓縮表表尾節(jié)點(diǎn)距離壓縮列表的起始地址有多少字節(jié):通過整個(gè)偏移量,程序無需遍歷整個(gè)壓縮列表皆可以確定表尾節(jié)點(diǎn)的地址 |
| zllen | uint16_t | 2字節(jié) | 記錄了壓縮列表包含的節(jié)點(diǎn)數(shù)量 |
| entryX | 列表節(jié)點(diǎn) | 不定 | 壓縮列表包含的各個(gè)節(jié)點(diǎn) |
| zlend | uint8_t | 1字節(jié) | 特殊值0xFF(十進(jìn)制255),用于標(biāo)記壓縮列表的末端 |
壓縮列表節(jié)點(diǎn)的構(gòu)成
| previous_entry_length | encoding | content |
|---|
previous_entry_length:以字節(jié)為單位,記錄了壓縮列表中前一個(gè)節(jié)點(diǎn)的長度。
因?yàn)楣?jié)點(diǎn)的previous_entry_length屬性記錄了前一個(gè)節(jié)點(diǎn)的長度,所以程序可以通過指針運(yùn)算,根據(jù)當(dāng)前節(jié)點(diǎn)的起始地址來計(jì)算出前一個(gè)節(jié)點(diǎn)的起始地址。
encoding:記錄了節(jié)點(diǎn)content屬性所保存數(shù)據(jù)的類型以及長度
content:負(fù)責(zé)保存節(jié)點(diǎn)的值,可以是一個(gè)字節(jié)數(shù)組或者整數(shù)。
總結(jié)
壓縮列表是一種為節(jié)約內(nèi)存而開發(fā)的順序型數(shù)據(jù)結(jié)構(gòu)。
壓縮列表被用作列表建和哈希鍵的底層實(shí)現(xiàn)之一。
壓縮列表可以包含多個(gè)節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)可以保存一個(gè)字節(jié)數(shù)組或者整數(shù)值。