1、壓縮列表(ziplist) 是列表鍵和hash鍵的底層實現(xiàn)之一,當(dāng)列表建存儲小的整數(shù)值,或者長度較短的字符串redis就會使用壓縮列表,當(dāng)一個hash鍵值對,鍵和值要么是小整數(shù)值要么是長度較短的字符串,那么redis就會使用壓縮列表來底層實現(xiàn)
2、壓縮列表底層構(gòu)成

2.1、壓縮列表是為節(jié)約內(nèi)存開發(fā),是由一系列特殊編碼連續(xù)內(nèi)存塊組成的順序型數(shù)據(jù)結(jié)構(gòu),一個壓縮列表可以包含任意多個節(jié)點,每個節(jié)點保存一個字節(jié)數(shù)組或者一個整數(shù)值
2.2、zblbytes unit_32_t 4字節(jié),記錄整個壓縮列表占用內(nèi)存字節(jié)數(shù):在對壓縮列表進行內(nèi)存重分配,或者計算zlend的位置時使用
zltail unit_32_t 4字節(jié) 記錄壓縮列表表尾節(jié)點距離壓縮列表起始地址有多少字節(jié):通過這個偏移量,程序無須遍歷整個壓縮列表就能確定壓縮列表 尾節(jié)點的地址
zllen int_16 2字節(jié) 記錄壓縮列表節(jié)點數(shù)量,當(dāng)數(shù)值=65535時,依然要遍歷列表才能計算出來
entryX 列表節(jié)點 節(jié)點的長度由節(jié)點保存的內(nèi)容決定
zlend int_8 1字節(jié) 特殊值0xFF 十進制255,用于標(biāo)記壓縮列表末端
3、壓縮列表節(jié)點的構(gòu)成

3.1、每個壓縮列表節(jié)點可以保存一個字節(jié)數(shù)組或者一個整數(shù)值,字節(jié)數(shù)組以下三種長度的一種
長度小于等于63(2的6次方-1)字節(jié)的字節(jié)數(shù)組
長度小于等于16383(2的14次方-1)字節(jié)的字節(jié)數(shù)組
長度小于等于4294967295(2的32次方-1)字節(jié)的字節(jié)數(shù)組
整數(shù)值以下六中長度
4位長,0-12之間無符號整數(shù)
1字節(jié) 3字節(jié) int_16 int_32 int_64
每個壓縮列表由previous_entry_length encoding content三部分組成
3.2、previous_entry_length屬性以字節(jié)為單位,記錄前一個節(jié)點長度,比如前一個節(jié)點長度254,則屬性值字節(jié)長度1字節(jié),大于254,則為5字節(jié)其中屬性第一個字節(jié)為254,之后四字節(jié)用于保存前一個節(jié)點的長度,可以更加方便計算前一個節(jié)點的起始位置
3.3、encoding 記錄節(jié)點的content屬性所保存數(shù)據(jù)類型和長度
3.4、content 保存節(jié)點值,可以是一個字節(jié)數(shù)組或者整數(shù),值的類型和長度由節(jié)點的encoding屬性決定
4、連鎖更新,由于字節(jié)數(shù)變更,導(dǎo)致連續(xù)多次空間擴展操作稱為連續(xù)更新,添加或者刪除節(jié)點都可能引發(fā)連鎖更新,連鎖更新最壞情況下,需要n次空間重分配操作,每次空間分配最壞復(fù)雜度o(N)所以連鎖更新最壞復(fù)雜度o(n)
幾率很低
發(fā)生條件,多個連續(xù)的,長度結(jié)余250和253字節(jié)之間的節(jié)點,其次,即使出現(xiàn)連鎖更新,但是更新的節(jié)點數(shù)量不多,不會造成任何性能影響