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 图解
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的交集
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |