listpack 緊湊列表
- 說明: 因爲ziplist 在極小的概率下有可能發生級聯更新,當連續規模較大的級聯更新發生時,對 Redis 的性能有比較大的影響。所以 在 5.0 版本中, 新增 listpack 它是對 ziplist 結構的改進,在存儲空間上會更加節省,而且結構上也比 ziplist 要精簡。
- 結構
struct listpack<T> { int32 total_bytes; // 佔用的總字節數 int16 size; // 元素個數 T[] entries; // 緊湊排列的元素列表 int8 end; // 同 zlend 一樣,恆爲 0xFF } 相比於 ziplist 的定義,它有兩點改動: 1. 記錄的長度不再是前一個節點的長度,而是自己的長度。 2. 將記錄自己的長度放到了節點的尾部。 這樣做的好處是: 1. 不再需要 zltail_offset 屬性也可以快速定位到最後一個節點。用listpac 的總長度-最後一個節點的長度. 2. 每個節點記錄自己的長度,當本節點的值發生了改變,只需要更改自己的長度即可。不再需要更改別的節點的屬性,也就徹底的解決掉了級聯更新問題。
- listpack 的設計的目的是用來取代 ziplist,不過當下還沒有做好替換 ziplist 的準備,因爲有很多兼容性的問題需要考慮,ziplist 在 Redis 數據結構中使用太廣泛了,替換起來複雜度會非常之高。
- 在 5.0 版本引入的 Stream 數據結構中,就使用了 listpack 而不是 ziplist.