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 降級
整數集合不支援降級操作,一旦數組類型更新,編碼一直保持更新後的狀态。