99re热这里只有精品视频,7777色鬼xxxx欧美色妇,国产成人精品一区二三区在线观看,内射爽无广熟女亚洲,精品人妻av一区二区三区

Redis 整數(shù)集合的實(shí)現(xiàn)

2018-08-02 14:45 更新

整數(shù)集合(intset)是 Redis 用于保存整數(shù)值的集合抽象數(shù)據(jù)結(jié)構(gòu), 它可以保存類型為 int16_t 、 int32_t 或者 int64_t 的整數(shù)值, 并且保證集合中不會(huì)出現(xiàn)重復(fù)元素。

每個(gè) intset.h/intset 結(jié)構(gòu)表示一個(gè)整數(shù)集合:

typedef struct intset {

    // 編碼方式
    uint32_t encoding;

    // 集合包含的元素?cái)?shù)量
    uint32_t length;

    // 保存元素的數(shù)組
    int8_t contents[];

} intset;

contents 數(shù)組是整數(shù)集合的底層實(shí)現(xiàn): 整數(shù)集合的每個(gè)元素都是 contents 數(shù)組的一個(gè)數(shù)組項(xiàng)(item), 各個(gè)項(xiàng)在數(shù)組中按值的大小從小到大有序地排列, 并且數(shù)組中不包含任何重復(fù)項(xiàng)。

length 屬性記錄了整數(shù)集合包含的元素?cái)?shù)量, 也即是 contents 數(shù)組的長度。

雖然 intset 結(jié)構(gòu)將 contents 屬性聲明為 int8_t 類型的數(shù)組, 但實(shí)際上 contents 數(shù)組并不保存任何 int8_t 類型的值 —— contents 數(shù)組的真正類型取決于 encoding 屬性的值:

  • 如果 encoding 屬性的值為 INTSET_ENC_INT16 , 那么 contents 就是一個(gè) int16_t 類型的數(shù)組, 數(shù)組里的每個(gè)項(xiàng)都是一個(gè) int16_t 類型的整數(shù)值 (最小值為 -32,768 ,最大值為 32,767 )。
  • 如果 encoding 屬性的值為 INTSET_ENC_INT32 , 那么 contents 就是一個(gè) int32_t 類型的數(shù)組, 數(shù)組里的每個(gè)項(xiàng)都是一個(gè) int32_t 類型的整數(shù)值 (最小值為 -2,147,483,648 ,最大值為 2,147,483,647 )。
  • 如果 encoding 屬性的值為 INTSET_ENC_INT64 , 那么 contents 就是一個(gè) int64_t 類型的數(shù)組, 數(shù)組里的每個(gè)項(xiàng)都是一個(gè) int64_t 類型的整數(shù)值 (最小值為 -9,223,372,036,854,775,808 ,最大值為 9,223,372,036,854,775,807 )。

圖 6-1 展示了一個(gè)整數(shù)集合示例:

  • encoding 屬性的值為 INTSET_ENC_INT16 , 表示整數(shù)集合的底層實(shí)現(xiàn)為 int16_t 類型的數(shù)組, 而集合保存的都是 int16_t 類型的整數(shù)值。
  • length 屬性的值為 5 , 表示整數(shù)集合包含五個(gè)元素。
  • contents 數(shù)組按從小到大的順序保存著集合中的五個(gè)元素。
  • 因?yàn)槊總€(gè)集合元素都是 int16_t 類型的整數(shù)值, 所以 contents 數(shù)組的大小等于 sizeof(int16_t) * 5 = 16 * 5 = 80 位。

圖 6-2 展示了另一個(gè)整數(shù)集合示例:

  • encoding 屬性的值為 INTSET_ENC_INT64 , 表示整數(shù)集合的底層實(shí)現(xiàn)為 int64_t 類型的數(shù)組, 而數(shù)組中保存的都是 int64_t 類型的整數(shù)值。
  • length 屬性的值為 4 , 表示整數(shù)集合包含四個(gè)元素。
  • contents 數(shù)組按從小到大的順序保存著集合中的四個(gè)元素。
  • 因?yàn)槊總€(gè)集合元素都是 int64_t 類型的整數(shù)值, 所以 contents 數(shù)組的大小為 sizeof(int64_t) * 4 = 64 * 4 = 256 位。

雖然 contents 數(shù)組保存的四個(gè)整數(shù)值中, 只有 -2675256175807981027 是真正需要用 int64_t 類型來保存的, 而其他的 1 、 3 、 5 三個(gè)值都可以用 int16_t 類型來保存, 不過根據(jù)整數(shù)集合的升級(jí)規(guī)則, 當(dāng)向一個(gè)底層為 int16_t 數(shù)組的整數(shù)集合添加一個(gè) int64_t 類型的整數(shù)值時(shí), 整數(shù)集合已有的所有元素都會(huì)被轉(zhuǎn)換成 int64_t 類型, 所以 contents 數(shù)組保存的四個(gè)整數(shù)值都是 int64_t 類型的, 不僅僅是-2675256175807981027 。

接下來的一節(jié)將對(duì)整數(shù)集合的升級(jí)操作進(jìn)行詳細(xì)的介紹。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)