最新:redis記憶體——三個重要的緩衝區
最新:redis記憶體——記憶體消耗(記憶體都去哪了?)
最新:redis持久化——如何選擇合適的持久化方式
最新:redis持久化——aof日誌
整數集合(intset)並不是乙個基礎的資料結構,而是redis自己設計的一種儲存結構,是集合鍵的底層實現之一,當乙個集合只包含整數值元素,並且這個集合的元素數量不多時, redis i就會使用整數集合作為集合鍵的底層實現。
整數集合(intset)是redis用於儲存整數值的集合抽象資料結構,它可以儲存型別為int16_t、int32_t或者int64_t的整數值,並且保證集合中不會出現重複元素。
//每個intset結構表示乙個整數集合
如上圖,為一int16_t型別的整數集合,我們可以看到陣列中儲存了5個int16_t型別的整數,它們按照從小到大的順序依次排列。這個時候我們思考乙個問題。如果這個時候存入乙個int32_t型別的整數會怎麼樣?記憶體溢位?這個時候就要提到整數集合的公升級。
2.1 整數集合公升級過程
正如上面所提到的問題,每當我們要將乙個新元素新增到整數集合裡面,並且新元素的型別比整數集合現有所有元素的型別都要長時,整數集合需要先進行公升級,然後才能將新元素新增到整數集合裡面。公升級整數集合並新增新元素主要分三步來進行。
根據新元素的型別,擴充套件整數集合底層陣列的空間大小,並為新元素分配空間。
將底層陣列現有的所有元素都轉換成與新元素相同的型別,並將型別轉換後的元素放置到正確的位上,而且在放置元素的過程中,需要繼續維持底層陣列的有序性質不變。
將新元素新增到底層陣列裡面。
2.2 整數集合公升級的優點
提公升靈活性
因為c語言是靜態型別語言,為了避免型別錯誤,我們通常不會將兩種不同型別的值放在同乙個資料結構裡面。
例如,我們一般只使用int16_t型別的陣列來儲存int16_t型別的值,只使用int32_t型別的陣列來儲存int32_t型別的值,諸如此類。但是,因為整數集合可以通過自動公升級底層陣列來適應新元素,所以我們可以隨意地將int16_t、int32_t或者int64_t型別的整數新增到集合中,而不必擔心出現型別錯誤,這種做法非常靈活。
節約記憶體
要讓乙個陣列可以同時儲存int16_t、int32_t、int64_t三種型別的值,最簡單的做法就是直接使用int64t型別的陣列作為整數集合的底層實現。不過這樣一來,即使新增到整數集合裡面的都是int16_t型別或者int32_t型別的值,陣列都需要使用int64_t型別的空間去儲存它們,從而出現浪費記憶體的情況。
而整數集合現在的做法既可以讓集合能同時儲存三種不同型別的值,又可以確保公升級操作只會在有需要的時候進行,這可以盡量節省記憶體。如果我們一直只向整數集合新增int16_t型別的值,那麼整數集合的底層實現就會一直是int16_t型別的陣列,只有在我們要將int32_t型別或者int64_t型別的值新增到集合時,程式才會對陣列進行公升級。
2.3 降級
整數集合不支援降級操作,一旦對陣列進行了公升級,編碼就會一直保持公升級後的狀態。也就是說一旦我們向乙個int16_t的整數集合內新增了乙個int32_t的元素後,整數集合將公升級到int32_t型別。即使後續的操作中我們刪除了這個元素,整數集合還是會保持int32_t型別的狀態。
操作時間複雜度
建立乙個新的整數集合
o(1)
新增指定元素到集合
o(n)
移除指定元素
o(n)
判斷指定元素是否在集合中
o(logn)
隨機返回乙個元素
o(1)
取出在指定索引上的元素
o(1)
返回集合包含的元素個數
o(1)
返回集合占用的記憶體位元組數
o(1)
最新:redis記憶體——三個重要的緩衝區
最新:redis記憶體——記憶體消耗(記憶體都去哪了?)
最新:redis持久化——如何選擇合適的持久化方式
最新:redis持久化——aof日誌
redis持久化——記憶體快照(rdb)
一文回顧redis五大物件(資料型別)
redis物件——有序集合(zset)
redis物件——集合(set)
redis物件——列表(list)
redis物件——雜湊(hash)
redis資料結構——quicklist
redis物件——字串
redis物件——redis物件系統簡介
redis資料結構——壓縮列表
redis資料結構——整數集合
redis資料結構——跳躍表
redis資料結構——字典
redis資料結構——鍊錶
redis資料結構——簡單動態字串sds
Redis資料結構 intset(整數集合)
整數集合是redis集合鍵的底層實現之一,如果乙個集合只包含整數值元素,而且元素數量不多,redis就會用整數集合作為集合鍵的底層實現 redis集合鍵的另一種底層實現是跳表 一 整數集合的應用場景 跟整數集合intset相關的redis命令主要有zadd sadd等等 二 整數集合的資料結構 ty...
Redis資料結構 整數集合 intset
整數集合 整數集合是集合鍵的底層實現之一,當乙個集合只包含整數值元素,並且這個集合的元素數量不多時,redis就會使用整數集合作為集合鍵的底層實現。1 整數集合實現 整數集合是redis用於儲存整數值的集合抽象資料結構,它可以可以儲存型別位int16 t int32 t int64 t的整數值,並且...
Redis 資料結構與物件 整數集合
整數集合是集合鍵的底層實現之一,當乙個集合只包含整數值元素,並且這個集合的元素數量不多,redis會使用整數集合作為集合的底層實現 typedef struct intset整數集合可以儲存的值有int16,int32,int64 如果編碼方式為intset enc int16,contents陣列...