Redis學習筆記(五) 整數集合

2021-10-11 11:26:55 字數 1474 閱讀 1976

2. 整數集合的api

參考資料

redis中,整數集合是集合鍵的底層之一。

乙個集合只包含整數元素,且這個集合中元素個數不多的情況下,redis就會使用整數集合作為集合鍵的底層實現。

1.1 資料結構設計

以redis6.0原始碼為例,整數集合由intset.c/intset結構定義,資料結構設計如下:

typedef struct intset  intset;
// intset.c

#define intset_enc_int16 (sizeof(int16_t))

#define intset_enc_int32 (sizeof(int32_t))

#define intset_enc_int64 (sizeof(int64_t))

舉例,如encoding取值為intset_enc_int32,表示contents陣列儲存的每個元素都是int32_t型別的整數。

下圖表示乙個包含3個型別為uint16_t的元素的整數集合:

當建立空的整數集合時,為了節約記憶體,預設的encoding取值為intset_enc_int16(參考intset.c/intsetnew的實現)

1.2 公升級操作

考慮插入新元素a到整數集合s的場景:如果新元素所佔位元組大小大於整數集合中現有的任意乙個元素所佔位元組大小(即sizeof(a) > s.encoding),就需要先對整數集合執行公升級操作後,再執行插入操作。

公升級操作的要點如下:

static intset *intsetupgradeandadd(intset *is, int64_t value)
另外,redis中的整數集合不支援降級操作。

api功能

複雜度intset *intsetnew(void);

建立空的整數集合

o(1)

intset *intsetadd(intset *is, int64_t value, uint8_t *success);

插入新元素到整數集合

o(n)

intset *intsetremove(intset *is, int64_t value, int *success);

刪除整數集合中的指定元素

o(n)

uint8_t intsetfind(intset *is, int64_t value);

查詢元素是否在整數集合中。用二分查詢法實現

o(logn)

《redis設計與實現》 —— 第6章 整數集合

五 整數集合(redis)

整數集合 intset 是集合鍵的底層實現之一當乙個集合只包含整數值元素,並且這 個集合的元素數量不多時,redis就會使用整數集合作為集合鍵的底層實現 contents 陣列 1.儲存元素的陣列 2.值的大小從小到大有序地排列 3.陣列中不包含任何重複項 length 長度 記錄了整數集合包含的元...

redis學習筆記五 有序集合

1 增加元素 zadd key val property val prperty.增加key中property的值,如果元素已經存在,則修改元素的值 2 獲取元素的值 zscore key property 3 獲取排名在某個範圍的元素列表 zrange key start stop withsco...

Redis閱讀筆記 整數集合

整數集合 intset 是集合鍵的底層實現之一,當乙個集合只包含了整數值元素,並且這個集合的元素數量不多時,redis就會使用整數集合作為集合鍵的底層實現。舉個例子,如果建立乙個只包含5個元素的集合鍵,並且集合中的所有元素都是整數值,那麼這個集合鍵的底層實現就會是整數集合 127.0.0.1 637...