Redis設計與實現——第一部分 數據結構與對象 第6章 整數集合

使用場景:
集合鍵的底層實現之一。
整數集合的底層實現爲數組,這個數組以有序、無重複的方式保存集合元素,在有需要時,程序會根據新添加元素的類型,改變這個數組的類型。
升級操作作爲整數集合帶來了操作上的靈活性,並且儘可能地節約了內存。
整數集合只支持升級操作,不支持降級操作。

整數集合(intset)是Redis用於保存整數數值的集合抽象數據結構,他可以保存類型爲int16_t、int32_t或者int64_t的整數值,並且保證集合中不會出現重複元素。
intset.h/intset
typedef struct intset {
//編碼方式 INTSET_ENC_INT16 INTSET_ENC_INT32 INTSET_ENC_INT64
uint32_t encoding;
// 集合包含的元素數量
uint32_t length;
// 保存元素的數組 類型取決於encoding的取值
int8_t contents[];
} intset;
contents數組是整數集合的底層實現,整數集合的每個元素都是contents數組的一個數組項(item),各個項在數組中按值的大小從小到大有序的排列,並且數組中不包含任何重複項。

升級 O(N)
添加一個新元素,如果新元素的類型比整數集合現有的所有元素類型都要長時,需要先升級。
步驟:
1.根據新元素的類型,擴展整數集合底層數組的空間大小,併爲新元素分配空間。
2.將底層數組現有的所有元素都轉換成新元素相同的類型,並將類型轉換後的元素放到正確的位置上,並且有序性不變。
3.將新元素添加到底層數組裏面。
好處:提升靈活性 & 節約內存
不支持降級

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章