Set數據結構 使用 intset 當同時滿足下麵兩個條件時,使用 intset 存儲數據 元素個數少於512個 (set-max-intset-entries: 512) 所有元素都是整數值 不滿足上面的條件, 使用 hashtable intset 圖解 //intset 的編碼方式 #defi ...
Set數據結構
- 使用 intset
當同時滿足下麵兩個條件時,使用 intset 存儲數據- 元素個數少於512個 (set-max-intset-entries: 512)
- 所有元素都是整數值
- 不滿足上面的條件, 使用 hashtable
intset 圖解
//intset 的編碼方式
#define INTSET_ENC_INT16 (sizeof(int16_t))
#define INTSET_ENC_INT32 (sizeof(int32_t))
#define INTSET_ENC_INT64 (sizeof(int64_t))
typedef struct intset {
uint32_t encoding; // 編碼方式
uint32_t length; // 集合包含的元素數量
int8_t contents[]; // 保存元素的數組
} intset;
可以看到 intset 很簡單, 基本和普通數組差不多
另外, 當使用 intset 編碼時,數據是有序的。
intset 演示:
127.0.0.1:6379> SADD nums 5 8 1 9 0
(integer) 5
127.0.0.1:6379> OBJECT ENCODING nums
"intset"
127.0.0.1:6379> SMEMBERS nums
1) "0"
2) "1"
3) "5"
4) "8"
5) "9"
hashtable 圖解
- 請參閱我之前的文章 Redis 原理 - Hash
- 當使用 hashtable 編碼時,數據是無序的。
hashtable 演示:
127.0.0.1:6379> SADD data a b c d e f
(integer) 6
127.0.0.1:6379> OBJECT ENCODING data
"hashtable"
127.0.0.1:6379> SMEMBERS data
1) "c"
2) "b"
3) "a"
4) "e"
5) "d"
6) "f"
Set常用的命令
- SADD key member 向set中添加一個或多個元素
- SREM key member 移除set中的指定元素
- SCARD key 返回set中元素的個數
- SMEMBERS key 獲取一個set中的所有成員
- SISMEMBER key member 判斷一個元素是否在set中
- SINTER key1 key2 ... 取多個set的交集