redis3 0 資料結構 整數集合

2021-09-25 18:36:53 字數 1171 閱讀 7939

整數集合是集合鍵的底層實現之一,當乙個集合只包含整數值元素,並且這個集合的元素數量不多時,redis就會使用整數集合作為集合鍵的底層實現。

整數集合(intset)時redis用於儲存整數值的集合抽象資料結構,它可以儲存型別為int16_t、int32_t 或者int64_t的整數值,並且保證集合中不會出現重複元素。

每個intest 結構表示乙個整數集合:

typedef struct intset  intset;
contents陣列是整數集合的底層實現:整數集合的每個元素都是contents陣列的乙個陣列項,各個項在陣列中按值的大小從小到大有序地排列,並且陣列中不包含任何重複項。

雖然intset結構將contents屬性宣告為int8_t型別的陣列,但實際上contents陣列不儲存任何int8_t型別的值,contents陣列的真正型別取決於encoding屬性的值:

每當我們要將乙個新元素新增到整數集合裡面,並且新元素的型別比整數集合現有元素的型別都要長時,整數集合需要先進行公升級,然後才能將新元素新增到整數集合裡面。

1). 根據新元素的型別,擴充套件整數集合底層陣列的空間大小,並為新元素分配空間。

2). 將底層陣列現有的所有元素都轉換成與新元素相同的型別,並將型別轉換後的元素放置在在正確的位上,而且在放置元素的過程中,需要繼續維持底層陣列的有序性質不變。

3). 將新元素新增到底層陣列裡面。

因為每次向整數集合新增新元素都可能會引起公升級,而每次公升級都需要對底層陣列中已有的所有元素進行型別轉換,所以向整數集合新增新元素的時間複雜度為o(n)。

提公升靈活性

因為整數集合可以通過自動公升級底層陣列來適應新元素,所以我們可以隨意地將int16_t、int32_t或者int64_t型別地整數新增到集合中,而不必擔心出現型別錯誤,這種做法非常靈活。

節約記憶體

要讓乙個陣列可以同時儲存int16_t、int32_t、int64_t 三種型別的值,最簡單的做法是直接使用int64_t型別的陣列作為整數集合的底層實現。但這樣,如果新增的都是int16_t型別或者int32_t型別的值,整數都需要使用int64_t型別的空間去儲存它們,從而出現浪費記憶體的情況。

現在這種做法可以盡量節省記憶體。

整數集合不支援降級操作,一旦對陣列進行了公升級,編碼就會一致保持公升級後的狀態。

集合鍵的底層實現之一。

《redis設計與實現》

Redis資料結構 整數集合

最新 redis記憶體 三個重要的緩衝區 最新 redis記憶體 記憶體消耗 記憶體都去哪了?最新 redis持久化 如何選擇合適的持久化方式 最新 redis持久化 aof日誌 整數集合 intset 並不是乙個基礎的資料結構,而是redis自己設計的一種儲存結構,是集合鍵的底層實現之一,當乙個集...

Redis資料結構 intset(整數集合)

整數集合是redis集合鍵的底層實現之一,如果乙個集合只包含整數值元素,而且元素數量不多,redis就會用整數集合作為集合鍵的底層實現 redis集合鍵的另一種底層實現是跳表 一 整數集合的應用場景 跟整數集合intset相關的redis命令主要有zadd sadd等等 二 整數集合的資料結構 ty...

Redis資料結構 整數集合 intset

整數集合 整數集合是集合鍵的底層實現之一,當乙個集合只包含整數值元素,並且這個集合的元素數量不多時,redis就會使用整數集合作為集合鍵的底層實現。1 整數集合實現 整數集合是redis用於儲存整數值的集合抽象資料結構,它可以可以儲存型別位int16 t int32 t int64 t的整數值,並且...