title: 无序集合set
categories:
- C++ Backend
- Redis
- Redis command
- Data structure
tags:
- Redis
date: 2025-04-03 00:00:00
cover: /images/Redis.png

集合

概述

集合就是把一些有关联的数据放到一起

  1. 集合中的元素是无序的!

有序:顺序很重要,变换一下顺序,就是不同的list1了
无序:顺序不重要,变换一下顺序,集合还是那个集合

  1. 集合中的元素是不能重复的(唯一的)

和list类似,集合中的每个元素也都是string类型(可以使用json类型的数据格式)

命令

普通命令

SADD

功能:将一个或者多个元素添加到set中
返回值:本次成功添加的个数
时间复杂度:$O(1)$

SADD key number [member...]

127.0.0.1:6379> sadd key 1 2 3 4
(integer) 4
127.0.0.1:6379> sadd key2 1 1 2 3 4
(integer) 4

SMEMBERS

功能:获取一个set中的所有元素
返回值:set中的元素
时间复杂度:近似$O(1)$

SMEMBERS key

127.0.0.1:6379> smembers key
1) "1"
2) "2"
3) "3"
4) "4"

SISMEMBER

功能:查找集合中元素
返回值:不存在,返回0,存在,返回值
时间复杂度:$O(1)$

SISMEMBER key member
127.0.0.1:6379> sismember key 100
(integer) 0
127.0.0.1:6379> sismember key 1
(integer) 1

SPOP

功能:从set中删除并返回一个或者多个元素。注意,由于set内的元素是无序的,所以取出哪个元素实际上是未定义行为,既可以看做是随机的。
时间复杂度:$O(1)$
返回值:取出的元素。

SPOP key [count]

127.0.0.1:6379> sadd key 1 2 3 4
(integer) 4
127.0.0.1:6379> spop key
"2"
127.0.0.1:6379> spop key
"4"
127.0.0.1:6379> spop key
"3"

SRANGEMEMBER

功能:随机取出set中的元素

SRANGEMEMBER key [count...]

127.0.0.1:6379> SRANDMEMBER key
"1"
127.0.0.1:6379> SRANDMEMBER key
"1"

SMOVE

功能:将一个元素从source set取出并放入destination set中。
时间复杂度:$O(1)$
返回值:1表示移动成功,0表示失败

SMOVE source destination member

127.0.0.1:6379> sadd key2 1 2 3 4
(integer) 4
127.0.0.1:6379> sadd key1 5 6 7 8
(integer) 4
127.0.0.1:6379> smove key1 key2 1
(integer) 0
127.0.0.1:6379> smove key2 key1 1
(integer) 1
127.0.0.1:6379> SMEMBERS key1
1) "1"
2) "5"
3) "6"
4) "7"
5) "8"
127.0.0.1:6379> SMEMBERS key2
1) "2"
2) "3"
3) "4"

SREM

功能:将指定的元素从set中删除,一次可以删除一个或者多个member
时间复杂度:$O(1)$
返回值:本次操作删除的元素个数

SREM key member [member...]

127.0.0.1:6379> sadd key 1 2 3 4
(integer) 4
127.0.0.1:6379> srem key 1
(integer) 1
127.0.0.1:6379> srem key 2
(integer) 1

集合间操作

SINTER

功能:对两个set取交集。
时间复杂度:$O(M * N)$,N是最小的集合元素个数,M是最大的集合元素个数。
返回值:最终交集的数据。

SINTER key [key...]

127.0.0.1:6379> sadd key2 3 4 5 6
(integer) 4
127.0.0.1:6379> sadd key 1 2 3 4
(integer) 4
127.0.0.1:6379> sinter key key2
1) "3"
2) "4"

SINTERSTORE

功能:获取给定set的交集中的元素并保存到目标set中。
时间复杂度:$O(N * M)$,N是最小的集合元素个数,M是最大的集合元素个数。
返回值:交集的元素个数

SINTERSTORE destination key [key...]

127.0.0.1:6379> SINTERSTORE key3 key key2
(integer) 2
127.0.0.1:6379> smembers key3
1) "3"
2) "4"

SUNION

功能:获取给定set的并集中的元素。
时间复杂度:$O(N)$,N给定所有集合的总的元素个数。
返回值:并集的元素。

SUNION key [key...]

127.0.0.1:6379> sunion key key2
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"

SUNIONSTORE

功能:获取给定set的并集中的元素并保存到目标set中。
时间复杂度:$O(N * M)$,N是最小的集合元素个数,M是最大的集合元素个数。
返回值:并集的元素个数。

SUNIONSTORE destination key [key...]

127.0.0.1:6379> sunion key key2
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"

SDIFF

功能:获取给定set的差集中的元素。
时间复杂度:$O(N)$,N给定所有集合的总的元素个数。
返回值:差集的元素。

SDIFF key [key...]

127.0.0.1:6379> sdiff key key2
1) "1"
2) "2"

SDIFFSTORE

功能:获取给定set的差集中的元素并保存到目标set中。
时间复杂度:$O(N * M)$,N是最小的集合元素个数,M是最大的集合元素个数。
返回值:差集的元素个数。

SDIFFSTORE destination key [key...]

127.0.0.1:6379> SDIFFSTORE key5 key key2
(integer) 2
127.0.0.1:6379> smembers key5
1) "1"
2) "2"

命令总结

命令 时间复杂度
sadd key element [element...] O(k),k元素个数
srem key element [element...] O(k),k元素个数
scard key O(1)
sismember key element O(1)
srandmember key [count] O(n),n是count个数
spop key [count] O(n),n是count个数
sismembers key O(k),k是元素个数
sinter key [key...] sitnerstore O(m * k),k是几个集合中元素最小的个数,m是几个集合中最大的个数
sunion key [key...] sunionstore O(k),k是多个集合的元素个数总和
sdiff key [key...] sdiffstore O(k),k是多个集合的元素个数总和

内部编码

  1. 当元素个数较少并且都为整数时,内部编码为inset
127.0.0.1:6379> sadd key 1 2 3 4
(integer) 4
127.0.0.1:6379> object encoding key
"intset"
127.0.0.1:6379> sadd key helloe
(integer) 1
127.0.0.1:6379> object encoding key
"hashtable"
  1. 当元素个数超过512个,内部编码为hashtable

应用场景