与 list 不同的是,集合内的元素是无序的,同时不能重复,和数学中的集合概念类似
命令
SADD
将一个或者多个元素添加到 set 中,但是需要注意的是重复的元素是无法加入的
sadd key member {member……}
时间复杂度: O(1)
返回值: 添加成功的元素个数
SMEMBERS
获取对应 set 中的所有元素,这些元素的顺序都是无序的
smembers key
时间复杂度: O(N)
返回值: 所有元素的列表
SISMEMBER
用来判断一个元素是否在set中存在
sismember key member
时间复杂度: O(1)
返回值: 1 表示元素在集合中, 0 表示元素不存在或者key不存在
SCARD
获取集合中的元素个数
scard key
时间复杂度: O(1)
返回值: 集合中的元素个数
SPOP
从 set 中删除并返回一个或者多个元素
但是因为 set 中的元素是无序的,所以取出的元素实际是随机的
spop key {count(取出的元素个数)}
时间复杂度: O(N) N就是count
返回值: 取出的元素
SMOVE
将一个元素从原 set 中取出放入到目标 set 中
smove source(原set) destination(目标set) member
时间复杂度: O(1)
返回值: 1 表示移动成功, 0 表示失败
SREM
将指定的元素从 set 中删除
srem key member {member……}
时间复杂度: O(N) N表示要删除的元素的个数
返回值: 这一次操作被删除的元素的个数
多集合之间的操作
和数学概念一样,交集、并集、差集
SINTER
获取指定 set 的交集中的元素
sinter key {key……}
时间复杂度: O(N*M) N和M分别是集合的元素个数
返回值: 满足交集条件的所有元素
SINTERSTORE
获取指定 set 的交集中的元素,然后保存到目标 set 中
sinterstore destination key {key……}
时间复杂度: O(N*M) N和M分别是集合的元素个数
返回值: 交集的元素的个数
SUNION
获取指定 set 的并集中的元素
sunion key {key……}
时间复杂度: O(N) N给定的所有集合的总的个数
返回值: 并集的元素
SUNIONSTORE
获取指定 set 的并集中的元素,然后保存到目标 set 中
sunionstore destination key {key……}
时间复杂度: O(N) N给定的所有集合的总的个数
返回值: 并集的元素个数
时间复杂度: O(N) N给定的所有集合的总的个数
返回值: 并集的元素个数
sdiff key {key……}
时间复杂度: O(N) N给定的所有集合的总的元素个数
返回值: 差集的所有元素
SDIFFSTORE
获取指定 set 的差集中的元素,然后保存到目标 set 中
sdiffstore destination key {key……}
时间复杂度: O(N) N给定的所有集合的总的个数
返回值: 差集的元素个数
命令总结
命令 | 操作 | 时间复杂度 |
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] | 若 count 为正,返回不重复元素;为负可能返回重复元素。 | O(n),n 是返回的元素数量 |
SPOP key [count] | 随机移除并返回元素,性能与数量相关。 | O(n),n 是弹出的元素数量 |
SMEMBERS key | 返回所有元素,需遍历整个集合,大集合慎用。 | O(k),k 是集合元素个数 |
SINTER key [key ...] | 求交集,需比较所有集合的公共元素。 | O(m * k),m 是集合数,k 是最小集合元素数 |
SINTERSTORE dest key [key ...] | 将交集结果存储到 dest,时间复杂度与 SINTER 相同。 | 同 SINTER |
SUNION key [key ...] | 求并集,需合并所有集合的元素。 | O(k),k 是所有集合元素总数 |
SUNIONSTORE dest key [key ...] | 将并集结果存储到 dest,时间复杂度与 SUNION 相同。 | 同 SUNION |
SDIFF key [key ...] | 求差集(第一个集合独有的元素)。 | O(k),k 是所有集合元素总数 |
SDIFFSTORE dest key [key ...] | 将差集结果存储到 dest,时间复杂度与 SDIFF 相同。 | 同 SDIFF |
内部编码
-
当元素个数较少,且元素都为整数时,为 intset
-
当元素个数超过 512 个,为 hashtable
-
当存在元素不是整数时,为 hashtable