壓縮列表的源碼實(shí)現
壓縮列表ziplist本質(zhì)上就是一個(gè)字節數組,是Redis為了節約內存而設計的一種線(xiàn)性數據結構,可以包含多個(gè)元素,每個(gè)元素可以是一個(gè)字節數組或一個(gè)整數。 Redis的有序集合、散列和列表都直接或者間接使用了壓縮列表。當有序集合或散列表的元素個(gè)數比較少,且元素都是短字符串時(shí),Redis便使用壓縮列表作為其底層數據存儲結構。列表使用快速鏈表(quicklist)數據結構存儲,而快速鏈表就是雙向鏈表與壓縮列表的組合。 ziplist 壓縮列表是一個(gè)特殊編碼的雙端鏈表(內存上連續),為了盡可能節省內存而設計的。ziplist 可以存儲字符串或者整數值,其中整數被編碼保存為實(shí)際的整數,而不是字符數組。ziplist 支持 O(1) 的時(shí)間復雜度在列表的兩端進(jìn)行 push 和 pop 操作。然而因為這些操作都需要對整個(gè) ziplist 進(jìn)行內存重分配(因為是一塊連續的內存),所以操作的實(shí)際復雜度和 ziplist 占用的內存大小有關(guān)。在 7.0 版本里,ziplist 已經(jīng)全面被 listpack 替換了(主要是因為連鎖更新較影響性能)