Redis資料結構 整數集合 intset

2021-10-02 04:11:01 字數 1181 閱讀 1358

整數集合

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

1、整數集合實現:

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

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

length屬性記錄了整數集合包含的元素數量,也即是contents陣列的長度。

雖然intset結構將contents屬性宣告為int8 t型別的陣列,但實際上contents陣列真正型別取決於encoding屬性的值:【intset_enc_int16、intset_enc_int32、intset_enc_int64】。

2、公升級

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

公升級整數集合並新增新元素共分為三步進行:

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

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

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

2.1、公升級好處

整數集合的公升級策略有兩個好處,乙個是提公升整數集合的靈活性,另乙個是盡可能地節約記憶體

提公升靈活性:c語言是靜態型別語言,為了避免型別錯誤,通常不會將兩種不同型別的值放到同乙個資料結構裡。

節約記憶體:如果直接讓陣列使用int64_t型別作為整數集合底層實現。但是實際儲存的是int16_t型別或者int32_t型別值,從而出現浪費記憶體的情況。

2.2、降級

不支援降級,一旦對陣列進行了公升級,編碼會一直保持公升級後的狀態

重點回顧:

Redis資料結構 整數集合

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

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

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

Redis 資料結構與物件 整數集合

整數集合是集合鍵的底層實現之一,當乙個集合只包含整數值元素,並且這個集合的元素數量不多,redis會使用整數集合作為集合的底層實現 typedef struct intset整數集合可以儲存的值有int16,int32,int64 如果編碼方式為intset enc int16,contents陣列...