天天看點

redis資料結構實作--整數集合(intset)

redis資料結構實作--整數集合(intset)

整數集合是集合鍵的底層實作之一,當一個集合鍵隻包含整數元素,且元素不多時,Redis會采用整數集合作為集合鍵的底層實作。

可以儲存int16_t,int32_t, int64_t類型的整數值。集合中不會出現重複元素

5.1 整數集合的實作

inset結構:

typedef struct inset{
        //編碼方式
        uint32_t encoding;
        
        //集合包含的元素數量
        uint32_t length;
        
        //儲存元素的數組
        int8_t contents[];
    }intset;           

contents數組就是整數數組的底層實作,各個元素在數組中按數組大小排序,且不可重複

雖然contents數組類型是int8_t,但是數組不存儲任何int8_t類型的元素,contents數組真正的類型取決于encoding的值

5.2 更新(upgrade)

當我們添加一個新元素到整數集合中,并且新元素的類型比整數集合中的所有元素類型都要長,那麼整數集合需要先進行更新,才能添加此新元素。

添加新元素并更新步驟:

1. 根據新元素類型,拓展整數集合底層數組空間大小,并為新元素配置設定空間
2. 将底層數組已有元素全部轉化成新元素相同類型,并放置到正确的位上,此過程要保持有序性不變
3. 添加新元素
4. 修改encoding
           

引發更新的新元素長度肯定大于數組内已存的所有元素,是以這個新元素的值要麼大于所有現有元素,要麼小于所有現有元素。

大于所有元素則插入在數組尾,小于所有元素則插入在數組頭

更新的好處

  • 更新帶來更好的靈活性:整數集合自适應各種不同類型;
  • 更新能夠節省記憶體:確定擴充記憶體隻在有需要的時候進行

5.3 降級

整數集合不支援降級操作,一旦數組類型更新,編碼一直保持更新後的狀态。

繼續閱讀