5 整數集合

2021-10-04 01:14:57 字數 1092 閱讀 8458

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

1.整數集合的實現

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

每個intset.h/intset結構表示乙個整數集合:

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

length屬性記錄了整數集合包含的元素數量。

雖然intset結構將contents設定成int8_t型別的陣列,但實際上,contents真正的型別取決於encoding的值。

encoding可以是intset_enc_int16、intset_enc_int32、intset_enc_int64,那麼對應的contents就是int16_t、int32_t、int64_t的陣列

2.公升級

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

公升級一共有三步:

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

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

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

因為向整數集合新增元素有可能會引起公升級,所以每次新增的時候時間複雜度為o(n)。

因為引發公升級的新元素長度總是長於所有元素,所以新元素的值要麼大於所有元素,要麼小於所有元素。

3.公升級的好處

好處有2個:提高整數集合的靈活性、盡可能的節約記憶體

因為c語言是靜態語言,為避免型別錯誤,不會講兩種不同型別的值放到同乙個資料結構裡面。但是自動公升級可以讓我們放隨便型別的整數

4.降級

整數集合不支援降級操作,一旦公升級,就會一直維持公升級後的狀態

Redis 整數集合

整數集合時集合鍵的底層實現之一,適用於只包含整數值,且數量不多的使用場景。可用於儲存int16 t,int32 t,int64 t的整數值。整數集合公升級 整數集合在儲存數值時,如果新的元素長度比久的大,那需要公升級。步驟如下 根據新元素的型別,擴充套件整數集合底層陣列空間大小,為新元素分配空間。將...

整數集合的實現

問題 很多應用都需要搜尋一組資料,比如編譯器查詢變數名以得到其位址,拼寫檢查器查詢字典,dns查詢網域名稱來獲得ip位址。這與如何儲存這些資料緊密相關。比如儲存一組整數,如果用集合來儲存,如何實現整數集合?我們一般實現有序整數集合,這樣就可以使用二分搜尋搜尋來快速進行搜尋。為簡單起見,下面的各種方案...

Redis之整數集合

整數集合是集合鍵的底層實現之一,當乙個結合只包含整數值元素,並且這個集合的元素數量不多時,redis就會使用整數集合作為集合作為集合鍵的底層實現。我們先來看一下它的結構 typedef struct intset intse它可以儲存的型別為int16 t int 32t int64 t,並且保證集...