无序集合set
集合
概述
集合就是把一些有关联的数据放到一起
- 集合中的元素是无序的!
有序:顺序很重要,变换一下顺序,就是不同的list1了
无序:顺序不重要,变换一下顺序,集合还是那个集合
- 集合中的元素是不能重复的(唯一的)
和list类似,集合中的每个元素也都是string类型(可以使用json类型的数据格式)
命令
普通命令
SADD
功能:将一个或者多个元素添加到set中
返回值:本次成功添加的个数
时间复杂度:$O(1)$
1 | SADD key number [member...] |
SMEMBERS
功能:获取一个set中的所有元素
返回值:set中的元素
时间复杂度:近似$O(1)$
1 | SMEMBERS key |
SISMEMBER
功能:查找集合中元素
返回值:不存在,返回0,存在,返回值
时间复杂度:$O(1)$
1 | SISMEMBER key member |
SPOP
功能:从set中删除并返回一个或者多个元素。注意,由于set内的元素是无序的,所以取出哪个元素实际上是未定义行为,既可以看做是随机的。
时间复杂度:$O(1)$
返回值:取出的元素。
1 | SPOP key [count] |
SRANGEMEMBER
功能:随机取出set中的元素
1 | SRANGEMEMBER key [count...] |
SMOVE
功能:将一个元素从source set取出并放入destination set中。
时间复杂度:$O(1)$
返回值:1表示移动成功,0表示失败
1 | SMOVE source destination member |
SREM
功能:将指定的元素从set中删除,一次可以删除一个或者多个member
时间复杂度:$O(1)$
返回值:本次操作删除的元素个数
1 | SREM key member [member...] |
集合间操作
SINTER
功能:对两个set取交集。
时间复杂度:$O(M * N)$,N是最小的集合元素个数,M是最大的集合元素个数。
返回值:最终交集的数据。
1 | SINTER key [key...] |
SINTERSTORE
功能:获取给定set的交集中的元素并保存到目标set中。
时间复杂度:$O(N * M)$,N是最小的集合元素个数,M是最大的集合元素个数。
返回值:交集的元素个数
1 | SINTERSTORE destination key [key...] |
SUNION
功能:获取给定set的并集中的元素。
时间复杂度:$O(N)$,N给定所有集合的总的元素个数。
返回值:并集的元素。
1 | SUNION key [key...] |
SUNIONSTORE
功能:获取给定set的并集中的元素并保存到目标set中。
时间复杂度:$O(N * M)$,N是最小的集合元素个数,M是最大的集合元素个数。
返回值:并集的元素个数。
1 | SUNIONSTORE destination key [key...] |
SDIFF
功能:获取给定set的差集中的元素。
时间复杂度:$O(N)$,N给定所有集合的总的元素个数。
返回值:差集的元素。
1 | SDIFF key [key...] |
SDIFFSTORE
功能:获取给定set的差集中的元素并保存到目标set中。
时间复杂度:$O(N * M)$,N是最小的集合元素个数,M是最大的集合元素个数。
返回值:差集的元素个数。
1 | SDIFFSTORE destination key [key...] |
命令总结
| 命令 | 时间复杂度 |
|---|---|
| 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是多个集合的元素个数总和 |
内部编码
- intest:为了节省空间,做出的特定优化,当元素均为整数,并且元素个数不是很多的时候。
- hashtable:当集合类型无法满足inset的条件时,Redis会使用hashtable作为集合的内部实现
- 当元素个数较少并且都为整数时,内部编码为inset
1 | 127.0.0.1:6379> sadd key 1 2 3 4 |
- 当元素个数超过512个,内部编码为hashtable



