1. 程式人生 > >Redis數據結構之整數集合

Redis數據結構之整數集合

red bubuko 底層 不支持 style 示例 類型轉換 新元素 包含

  整數集合是Redis用於保存整數值的集合抽象數據結構,它可以保存類型為int16_t 、int32_t或者int64_t的整數值,並且保證集合中不會出現重復元素。

一、整數集合數據結構定義

技術分享圖片

參數說明:
contents:contents數組是整數集合的底層實現,整數集合的每個元素都是contents數組的一個數組項,各個項在數組中按值的大小從小到大有序地排列,並且數組中不包含任何重復項。
length:記錄了整數集合包含的元素數量,也即是contents數組的長度。
encoding:決定了contents數組中所有整數的類型,值可為INTSET_ENC_INT16、INTSET_ENC_INT32、INTSET_ENC_INT64。


示例:

技術分享圖片

二、升級
  每當我們要將一個新元素添加到整數集合裏面,並且新元素的類型比整數集合現有所有元素的類型都要長時,整數集合需要先進行升級,然後才能將新元素添加到整數集合裏面。
因為每次向整數集合添加新元素都可能會引起升級,而每次升級都需要對底層數組中已有的所有元素進行類型轉換,所以向整數集合添加新元素的時間復雜度為O(N)。
1. 升級並添加新元素過程:
(1)根據新元素的類型,擴展整數集合底層數組的空間大小,並為新元素分配空間。
(2)將底層數組現有的所有元素都轉換成與新元素相同的類型,並將類型轉換後的元素放置到正確的位上,而且在放置元素的過程中,需要繼續維持底層數組的有序性質不變。
(3)將新元素添加到底層數組裏面。


2. 升級的好處:
(1)提升靈活性:可隨意將整數添加到整數集合中而不必考慮其類型,不會發生類型錯誤。
(2)節約內存:總是使用能容納集合所有元素的最小類型,只有在需要的時候才會進行升級。
3. 升級的局限:
  整數集合不支持降級操作,一旦對數組進行了升級,編碼就會一直保持升級後的狀態。

三、整數集合在Redis中的用途
作為集合鍵的底層實現之一:當一個集合只包含整數值元素,並且這個集合的元素數量不多時,Redis就會使用整數集合作為集合鍵的底層實現。

Redis數據結構之整數集合