文章目录
- 前言
- 命令
- SADD
- SMEMBERS
- SISMEMBER
- SCARD
- SPOP
- SMOVE
- SREM
- 集合间操作
- SINTER
- SINTERSTORE
- SUNION
- SUNIONSTORE
- SDIFF
- SDIFFSTORE
- 命令小结
- 内部编码
- 使用场景
前言
集合类型也是保存多个字符串类型的元素的,和列表类型不同的是,set集合类型中的元素是无序的且集合中的元素是不允许出现重复的,一个集合中最多可以存储 2^32-1 个元素。
命令
SADD
SADD 命令将一个或者多个元素添加到集合中,如果集合不存在则会先创建出一个集合然后再添加元素。注意:重复的元素无法添加到一个集合中。SADD key member[member...]
时间复杂度:O(1)
返回值:本次操作添加成功的元素的个数
127.0.0.1:6379> sadd key 1
(integer) 1
127.0.0.1:6379> sadd key 2 2 3 4 #当向set中添加重复元素的时候,是无法成功添加的,set中保证每一个元素只存在一个
(integer) 3
SMEMBERS
SMEMBERS 命令获取一个 set 中的所有元素(元素间的顺序是无序的)SMEMBERS key
时间复杂度:O(N),N为 set 中元素个数
返回值:set 中的所有元素
127.0.0.1:6379> sadd key 1 3 2 4 5 8 6 7
(integer) 8
127.0.0.1:6379> smembers key # 可以看到set中元素的顺序和我们插入的顺序是不同的
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
7) "7"
8) "8"
SISMEMBER
SISMEMBER 命令判断一个元素是否在 set 中。SISMEMBER key member
时间复杂度:O(1)
返回值:1表示该元素在set中,0表示该元素不在set中
127.0.0.1:6379> sadd key 1 3 2 4 5 8 6 7
(integer) 8
127.0.0.1:6379> sismember key 1
(integer) 1
127.0.0.1:6379> sismember key 10
(integer) 0
SCARD
SCARD 命令获取一个 set 的基数(cardinality),即 set 中的元素个数。SCARD key
时间复杂度:O(1)
返回值:set 内元素的个数
127.0.0.1:6379> sadd key 1 3 2 4 5 8 6 7
(integer) 8
127.0.0.1:6379> scard key
(integer) 8
SPOP
SPOP 命令从 set 中删除并返回一个或者多个元素,这里是 pop,那么是否意味着是从 set 的末尾删除呢?其实不是的,因为 set 中的元素是无序的,所以取出哪个元素实际是未定义行为,即可以看作是随机的。SPOP key [count]
时间复杂度:O(N),N是count
返回值:删除的元素的值
127.0.0.1:6379> sadd key 1 3 2 4 5 8 6 7
(integer) 8
127.0.0.1:6379> spop key
"1"
127.0.0.1:6379> spop key 3
1) "6"
2) "7"
3) "2"127.0.0.1:6379> spop key 10 # 如果count的值大于set中元素的个数,那么会将set中的所有元素都删除
1) "3"
2) "4"
3) "5"
4) "8"
SMOVE
SMOVE 命令将一个元素从 set 中取出并且放入目标 set 中。SMOVE source destination member
时间复杂度:O(1)
返回值:1表示移动成功,0表示移动失败
127.0.0.1:6379> sadd key 1 3 2 4 5 8 6 7
(integer) 8
127.0.0.1:6379> smove key key2 3
(integer) 1
127.0.0.1:6379> smembers key2
1) "3"
127.0.0.1:6379> smove key key2 10 #key中不存在10这个元素,就会移动失败
(integer) 0
127.0.0.1:6379> smembers key2
1) "3"
127.0.0.1:6379> sadd key 3 #再向key中添加3元素,然后将这个3再移动到key2中,返回值是1表示成功了,key中的3会被删除,但是由于key2中已经存在3这个元素了,所以不会再将3插入
(integer) 1
127.0.0.1:6379> smove key key2 3
(integer) 1
127.0.0.1:6379> smembers key2
1) "3"
127.0.0.1:6379> smembers key
1) "1"
2) "2"
3) "4"
4) "5"
5) "6"
6) "7"
7) "8"
SREM
SREM 命令删除 set 中指定元素。SREM key member[member...]
时间复杂度:O(N),N为要删除的元素的个数
返回值:本次操作删除的元素的个数
127.0.0.1:6379> sadd key 1 3 2 4 5 8 6 7 [
(integer) 9
127.0.0.1:6379> srem key 1
(integer) 1
127.0.0.1:6379> smembers key
1) "7"
2) "6"
3) "4"
4) "3"
5) "8"
6) "5"
7) "2"
8) "["
127.0.0.1:6379> srem key 2 3 4
(integer) 3
127.0.0.1:6379> smembers key
1) "6"
2) "8"
3) "["
4) "7"
5) "5"
集合间操作
集合间操作包括:交集、并集和差集
SINTER
SINTER 命令获取给定 set 交集中的元素。SINTER key[key...]
时间复杂度:O(N*M),N是最小集合的元素的个数,M为最大的集合的元素的个数
返回值:交集的元素
127.0.0.1:6379> sadd key1 1 2 3 4
(integer) 4
127.0.0.1:6379> sadd key2 3 4 5 6
(integer) 4
127.0.0.1:6379> sinter key1 key2
1) "3"
2) "4"
SINTERSTORE
SINTERSTORE 命令将 set 交集的元素保存到目标 set 中。SINTERSTORE destination key[key...]
时间复杂度:O(N*M),N是最小集合的元素的个数,M为最大的集合的元素的个数
返回值:交集的元素的个数
127.0.0.1:6379> sadd key1 1 2 3 4
(integer) 4
127.0.0.1:6379> sadd key2 3 4 5 6
(integer) 4
127.0.0.1:6379> sinterstore key3 key1 key2
(integer) 2
127.0.0.1:6379> smembers key3
1) "3"
2) "4"
SUNION
SUNION 命令获取给定 set 并集的元素。SUNION key[key...]
时间复杂度:O(N),给定的所有集合的元素个数之和
返回值:并集的元素
127.0.0.1:6379> sadd key1 1 2 3 4
(integer) 4
127.0.0.1:6379> sadd key2 3 4 5 6
(integer) 4
127.0.0.1:6379> sunion key1 key2
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
SUNIONSTORE
SUNIONSTORE 命令获取指定 set 集合的并集并将其保存在目标 set 中。SUNIONSTORE destination key[key..]
时间复杂度:O(N),N为给定的 set 的所有元素的个数
返回值:并集的元素的个数
127.0.0.1:6379> sadd key1 1 2 3 4
(integer) 4
127.0.0.1:6379> sadd key2 3 4 5 6
(integer) 4
127.0.0.1:6379> sunionstore key3 key1 key2
(integer) 6
127.0.0.1:6379> smembers key3
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
SDIFF
SDIFF 命令获取给定 set 差集的元素。SDIFF key[key...]
。假设是 SDIFF key1 key2
,那么得到的结果就是 key1-key2。
时间复杂度:O(N),N为给定的集合中的所有元素的个数
返回值:差集中的元素
127.0.0.1:6379> sadd key1 1 2 3 4
(integer) 4
127.0.0.1:6379> sadd key2 3 4 5 6
(integer) 4
127.0.0.1:6379> sdiff key1 key2 # 得到key1-key2
1) "1"
2) "2"
127.0.0.1:6379> sdiff key2 key1 # 得到key2-key1
1) "5"
2) "6"
SDIFFSTORE
SDIFFSTORE 命令获取指定 set 的差集并且将其保存到目标 set 中。SDIFFSTORE destination key[key...]
时间复杂度:O(N),N为给定集合所有元素的个数
返回值:差集元素的个数
127.0.0.1:6379> sadd key1 1 2 3 4
(integer) 4
127.0.0.1:6379> sadd key2 3 4 5 6
(integer) 4
127.0.0.1:6379> sdiffstore key3 key1 key2
(integer) 2
127.0.0.1:6379> smembers key3
1) "1"
2) "2"
127.0.0.1:6379> sdiffstore key4 key2 key1
(integer) 2
127.0.0.1:6379> smembers key4
1) "5"
2) "6"
命令小结
命令 | 执行效果 | 时间复杂度 |
---|---|---|
sadd key member[member…] | 向set中添加一个或者多个元素 | O(K),K是插入的元素的个数 |
smembers key | 获取set中的所有元素 | O(N),N是set中所有元素的个数 |
sismember key member | 判断该元素是否是set中的元素 | O(1) |
scard key | 获取set中元素的个数 | O(N),N是set中所有元素的个数 |
spop key [count] | 删除set中count个元素 | O(K),K为count |
smove source destination member | 将source集合中的元素移动到destination集合中 | O(1) |
srem key member[member…] | 删除set中指定元素 | O(K),K为要删除的元素的个数 |
sinter key [key …] sitnerstore | 求给定集合的并集 | O(N*M),N是最小集合的元素的个数,M为最大的集合的元素的个数 |
sunion key [key …] sunionstore | 求给定集合的并集 | O(N),N为给定的 set 的所有元素的个数 |
sdiff key [key …] sdiffstore | 求给定集合的差集 | O(N),N为给定的 set 的所有元素的个数 |
内部编码
集合类型的内部编码有两种:
- intset(整数集合):当集合中的元素都是整数且元素的个数小于 set-max-intset-entries 配置(默认是512个)时,Redis 会选用 intset 来作为集合的内部实现,从而减少内存的使用。
- hashtable(哈希):当集合类型无法满足 intset 的条件时,Redis 会选择使用 hashtable 作为集合的内部实现。
127.0.0.1:6379> sadd key 1 2 3 4 5
(integer) 5
127.0.0.1:6379> object encoding key
"intset"
127.0.0.1:6379> sadd key1 1 2 3 hello 5
(integer) 5
127.0.0.1:6379> object encoding key1
"hashtable"
使用场景
- 标签和分类:
-
- 集合可以用于存储对象的标签或分类信息。例如,你可以使用一个集合来存储所有属于“科技”类别的文章ID,另一个集合来存储所有属于“娱乐”类别的文章ID。这样,你可以快速查询某个类别下的所有文章,或者找出同时属于多个类别的文章。
- 社交应用:
-
- 在社交应用中,集合可以用于存储用户的关注列表、粉丝列表或好友列表。由于集合中的元素是唯一的,因此可以确保列表中没有重复的用户。
- 实时统计:
-
- 在实时统计场景中,集合可以用于存储需要快速访问和更新的数据。例如,你可以使用集合来记录某个时间段内的活跃用户ID,以便快速计算活跃用户数量。