Redis 數據結構——整數集合

整數集合(intset)是集合鍵的底層實現之一,當一個集合只包含整數值元素,而且這個集合的元素數量很少時,Redis就會使用整數集合做爲集合鍵的底層實現。數組

整數集合的實現:
數據結構

    整數集合(intset) 是Redis用於保存整數值的集合抽象數據結構,它能夠保存類型爲int16_t, int32_t或者int64_t 的整數值,而且保證集合中不會出現重複元素。
ui

    intset.h/intset 結構表示一個整數集合:編碼

typedef struct intset {
    uint32_t encoding; //編碼方式
    uint32_t length;  //集合中包含的元素數量
    int8_t contents[]; //保存元素的數組
} intset;

    contents數組是整數集合的底層實現:整數集合的每一個元素都是contents數組的一個數組項(item),各個項在數組中按值的大小從小到大有序地排列,而且數組中不包含任何重複項。
spa

  length 屬性記錄了整數集合包含的元素數量,也便是contents數組的長度。
code

    雖然intset結構將contents屬性聲明爲int8_t 類型的數組,但實際上contents數組並不保存任何int8_t類型的值,contents數組的真正類型取決於encoding屬性的值:
內存

    * 若是encoding 屬性的值爲 INTSET_ENC_INT16, 那麼contents就是一個int16_t類型的數組,數組裏的每一個項都是一個int16_t, 那麼contents就是一個int16_t類型的數組,數組裏的每一個項都是一個int16_t類型的整數值(最小值爲-32768, 最大值爲32767)。
it

    * 若是encoding屬性的值爲INTSET_ENC_INT32,那麼contents就是一個int32_t 類型的數組,數組裏的每一個項都是一個int32_t 類型的整數值(最小值爲-2 147 483 648, 最大值爲2 147 483 647)。
class

 * 若是encoding屬性的值爲INTSET_ENC_INT64,那麼contents就是一個int64_t 類型的數組,數組裏的每一個項都是一個int64_t 類型的整數值(最小值爲-9 223 732 036 854 775 808, 最大值爲9 223 372 036 854 775 807)。擴展


升級

    每當咱們要將一個新元素添加到整數集合裏面,而且新元素的類型比整數集合如今全部元素的類型都要長時,整數集合須要先進行升級(upgrade),而後才能將新元素添加到整數集合裏面。

    1. 根據新元素的類型,擴展整數集合底層數組的空間大小,併爲新元素分配空間。

    2. 將底層數組現有的全部元素都轉換成與新元素相同的類型,並將新類型轉換後的元素放置到正確的位上,並且在放置元素的過程當中,須要繼續維持底層數組的有序性質不變。

    3.將新元素添加到底層數組裏面。


升級的好處

    整數集合的升級策略有兩個好處,一個是提高整數集合的靈活性,另外一個是儘量地節約內存。


降級

    整數集合不支持降級操做,一旦對數組進行了升級,編碼就會一直保持升級後的狀態。


 整數集合API

    


總結

    整數集合是集合鍵的底層實現之一。

    整數集合的底層實現爲數組,這個數組以有序,無重複的方式保存集合元素,在有須要時,程序會根據新添加元素的類型,改變這個數組的類型。

    升級操做做爲整數集合帶來了操做上的靈活性,而且儘量地節約了內存。

    整數集合只支持升級操做,不支持降級操做。

相關文章
相關標籤/搜索