Redis之整數集合
阿新 • • 發佈:2018-12-19
整數集合是集合鍵的底層實現之一,當一個結合只包含整數值元素,並且這個集合的元素數量不多時,redis就會使用整數集合作為集合作為集合鍵的底層實現。 我們先來看一下它的結構:
typedef struct intset {
// 編碼方式
uint32_t encoding;
// 集合包含的元素數量
uint32_t length;
// 儲存元素的陣列
int8_t contents[];
} intse
它可以儲存的型別為int16_t、int_32t、int64_t,並且保證集合中不會出現重複元素。 contents陣列時整數集合的底層實現,整數集合的每個元素都是contents陣列的一個數組項,各個項在陣列中按值的大小從小到大有序地排列,並且陣列中不包含任何重複項。 length屬性記錄了整數集合包含的元素數量,也就是contents陣列的長度。 雖然inset結構將contents屬性宣告為int8_t型別的陣列,但實際上contents陣列並不儲存任何int8_t型別的值,contents陣列的真正型別卻決於encoding屬性的值 升級 每當我們將一個新元素新增到整數集合裡面,並且新元素的型別比整數集合現有所有元素的型別都要長時,整數集合需要新進行升級,然後才能將新元素新增到整數集合裡面。 升級整數集合並新增新元素的步驟: 1、根據新元素的型別,擴充套件整數集合底層陣列的空間大小,併為新元素分配空間2、將底層陣列現有的所有元素都轉換成新元素相同的型別,並將型別轉換後的元素放置到正確的位上,而且放置元素的過程中,需要繼續維持底層陣列的有序性質不變。 3、將新元素新增到底層數組裡面 升級的好處 1、提升靈活性 2、節約記憶體