壓縮列表(ziplist)是列表鍵和哈希鍵的底層實現之一。當一個列表鍵只包含少許列表項,而且每一個列表項是小整數或者短字符串,那麼Redis會使用壓縮列表來做爲底層的實現。數組
壓縮列表是Redis爲了節約內存而開發的,是由一系列特殊編碼的連續內存塊組成的順序型(sequential)數據結構。數據結構
<zlbytes><zltail><zllen><entry><entry><zlend>ui
每一個節點,都有previous_entry_length、encoding、content三個部分組成:編碼
5. zlend表示壓縮列表的結尾,默認值爲0xFF,1字節spa
連鎖更新是指一種極端的環境下,添加或刪除節點形成後面的節點都須要進行空間重分配的狀況。ip
假設有種極端狀況,列表有N個節點,每一個節點的previous_entry_length長度都在250~253字節之間(首節點除外,previous_entry_length爲0),即這N個節點的previous_entry_length都是1字節編碼,這時有一個長度大於253字節的節點插入到表頭,因爲以前的表頭previous_entry_length爲0,且只有1字節長度,沒法表示大於253字節的數,因此須要進行空間重分配,將previous_entry_length擴展爲5字節。內存
這時候因爲原首節點(e1)previous_entry_length擴張,致使總體長度擴張增長了4字節,後面一個節點(e2)的previous_entry_length也要相應增長4,e2的previous_entry_length也須要從1字節擴張到5字節,這個擴張將會逐一影響後面的每一個節點都進行previous_entry_length的擴張,這種現象就叫作連鎖更新,因此最壞時間複雜度爲O(N^2);開發
還有一種狀況即爲N個節點除首節點外previous_entry_length都是5字節,長度都爲254~257,當刪除首節點,也會形成一種連鎖收縮狀況,這種也叫連鎖更新。字符串
因爲連鎖更新的出現須要至關特殊的狀況,因此壓縮鏈表添加,刪除操做的時間平均複雜度平均仍然是O(N),能夠放心使用。io