怀念夏天 发表于 2022-8-20 08:32:02

Redis 原理 - Set

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;https://api.broadm.xyz/api/file/images/5ab581cd56d04e8b9dc653fe08ae959a.png
可以看到 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的交集

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: Redis 原理 - Set