[redis] 數據結構 -- 緊湊列表

listpack 緊湊列表

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