SADD key member [member ...]
从 1.0.0 开始可用。
段落引用时间复杂度:每个添加的元素 O(1),因此当使用多个参数调用命令时添加 N 个元素是 O(N)。
将指定的成员添加到存储在的集合中key。已经是该集合成员的指定成员将被忽略。如果key不存在,则在添加指定成员之前创建一个新集合。
key当存储的值不是集合时返回错误。
返回值
整数回复:添加到集合中的元素数量,不包括集合中已经存在的所有元素。
例子
redis> SADD myset "Hello"
(integer) 1
redis> SADD myset "World"
(integer) 1
redis> SADD myset "World"
(integer) 0
redis> SMEMBERS myset
1) "World"
2) "Hello"
redis>
历史
- Redis 版本 >= 2.4.0:接受多个
member
参数。
SCARD key
从 1.0.0 开始可用。
时间复杂度: O(1)
返回存储在的集合的集合基数(元素数)key。
返回值
整数回复:集合的基数(元素数),或者0如果key 不存在。
例子
redis> SADD myset "Hello"
(integer) 1
redis> SADD myset "World"
(integer) 1
redis> SCARD myset
(integer) 2
redis>
SDIFF key [key ...]
从 1.0.0 开始可用。
时间复杂度: O(N),其中 N 是所有给定集合中元素的总数。
返回由第一个集合和所有后续集合之间的差异产生的集合成员。
例如:
key1 = {a,b,c,d}
key2 = {c}
key3 = {a,c,e}
SDIFF key1 key2 key3 = {b,d}
不存在的键被认为是空集。
返回值
数组回复:包含结果集成员的列表。
例子
redis> SADD key1 "a"
(integer) 1
redis> SADD key1 "b"
(integer) 1
redis> SADD key1 "c"
(integer) 1
redis> SADD key2 "c"
(integer) 1
redis> SADD key2 "d"
(integer) 1
redis> SADD key2 "e"
(integer) 1
redis> SDIFF key1 key2
1) "a"
2) "b"
redis>
SDIFFSTORE destination key [key ...]
从 1.0.0 开始可用。
时间复杂度: O(N),其中 N 是所有给定集合中元素的总数。
此命令等于SDIFF,但不是返回结果集,而是存储在destination.
如果destination已经存在,则将其覆盖。
返回值
整数回复:结果集中的元素数。
例子
redis> SADD key1 "a"
(integer) 1
redis> SADD key1 "b"
(integer) 1
redis> SADD key1 "c"
(integer) 1
redis> SADD key2 "c"
(integer) 1
redis> SADD key2 "d"
(integer) 1
redis> SADD key2 "e"
(integer) 1
redis> SDIFFSTORE key key1 key2
(integer) 2
redis> SMEMBERS key
1) "a"
2) "b"
redis>
SINTER key [key ...]
从 1.0.0 开始可用。
时间复杂度: O(N*M) 最坏情况,其中 N 是最小集合的基数,M 是集合的数量。
返回由所有给定集合的交集产生的集合成员。
例如:
key1 = {a,b,c,d}
key2 = {c}
key3 = {a,c,e}
SINTER key1 key2 key3 = {c}
不存在的键被认为是空集。如果其中一个键是空集,则结果集也是空的(因为集合与空集的交集总是导致空集)。
返回值
数组回复:包含结果集成员的列表。
例子
redis> SADD key1 "a"
(integer) 1
redis> SADD key1 "b"
(integer) 1
redis> SADD key1 "c"
(integer) 1
redis> SADD key2 "c"
(integer) 1
redis> SADD key2 "d"
(integer) 1
redis> SADD key2 "e"
(integer) 1
redis> SINTER key1 key2
1) "c"
redis>
SINTERCARD numkeys key [key ...] [LIMIT limit]
自 7.0.0 起可用。
时间复杂度: O(N*M) 最坏情况,其中 N 是最小集合的基数,M 是集合的数量。
此命令类似于SINTER,但它不返回结果集,而是只返回结果的基数。返回由所有给定集合的交集产生的集合的基数。
不存在的键被认为是空集。如果其中一个键是空集,则结果集也是空的(因为集合与空集的交集总是导致空集)。
默认情况下,该命令计算所有给定集合的交集的基数。当提供可选LIMIT参数(默认为 0,表示无限制)时,如果交集基数在计算过程中达到极限,算法将退出并产生极限作为基数。这样的实现确保了对限制低于实际交叉点基数的查询的显着加速。
返回值
整数回复:结果交集中的元素数。
例子
redis> SADD key1 "a"
(integer) 1
redis> SADD key1 "b"
(integer) 1
redis> SADD key1 "c"
(integer) 1
redis> SADD key1 "d"
(integer) 1
redis> SADD key2 "c"
(integer) 1
redis> SADD key2 "d"
(integer) 1
redis> SADD key2 "e"
(integer) 1
redis> SINTER key1 key2
1) "d"
2) "c"
redis> SINTERCARD 2 key1 key2
ERR Unknown or disabled command 'SINTERCARD'
redis> SINTERCARD 2 key1 key2 LIMIT 1
ERR Unknown or disabled command 'SINTERCARD'
redis>
SINTERSTORE destination key [key ...]
从 1.0.0 开始可用。
时间复杂度: O(N*M) 最坏情况,其中 N 是最小集合的基数,M 是集合的数量。
此命令等于SINTER,但不是返回结果集,而是存储在destination.
如果destination已经存在,则将其覆盖。
返回值
整数回复:结果集中的元素数。
例子
redis> SADD key1 "a"
(integer) 1
redis> SADD key1 "b"
(integer) 1
redis> SADD key1 "c"
(integer) 1
redis> SADD key2 "c"
(integer) 1
redis> SADD key2 "d"
(integer) 1
redis> SADD key2 "e"
(integer) 1
redis> SINTERSTORE key key1 key2
(integer) 1
redis> SMEMBERS key
1) "c"
redis>
SISMEMBER key member
从 1.0.0 开始可用。
时间复杂度: O(1)
返回是否member是存储在的集合的成员key。
返回值
整数回复,具体来说:
- 1如果元素是集合的成员。
- 0如果元素不是集合的成员,或者key不存在。
例子
redis> SADD myset "one"
(integer) 1
redis> SISMEMBER myset "one"
(integer) 1
redis> SISMEMBER myset "two"
(integer) 0
redis>
SMEMBERS key
从 1.0.0 开始可用。
时间复杂度: O(N),其中 N 是集合基数。
返回存储在的集合值的所有成员key。
这与使用一个参数运行SINTER具有相同的效果key。
返回值
数组回复:集合的所有元素。
例子
redis> SADD myset "Hello"
(integer) 1
redis> SADD myset "World"
(integer) 1
redis> SMEMBERS myset
1) "World"
2) "Hello"
redis>
SMISMEMBER key member [member ...]
从 6.2.0 开始可用。
时间复杂度: O(N),其中 N 是要检查成员资格的元素数
返回每个是否member是存储在的集合的成员key。
对于每个member,1如果值是集合的成员,或者0元素不是集合的成员或key不存在,则返回。
返回值
数组回复:表示给定元素的成员资格的列表,与请求的顺序相同。
例子
redis> SADD myset "one"
(integer) 1
redis> SADD myset "one"
(integer) 0
redis> SMISMEMBER myset "one" "notamember"
1) (integer) 1
2) (integer) 0
redis>
SMOVE source destination member
从 1.0.0 开始可用。
时间复杂度: O(1)
member从集合 at移动source到集合 at destination。这个操作是原子的。在每个给定的时刻,该元素都将显示为其他客户的成员source 或 destination为其他客户。
如果源集不存在或不包含指定元素,则不执行任何操作并0返回。否则,该元素将从源集中移除并添加到目标集中。当指定元素已存在于目标集中时,仅将其从源集中移除。
如果source或destination不包含设置值,则返回错误。
返回值
整数回复,具体来说:
- 1如果元素被移动。
- 0如果元素不是的成员source并且没有执行任何操作。
例子
redis> SADD myset "one"
(integer) 1
redis> SADD myset "two"
(integer) 1
redis> SADD myotherset "three"
(integer) 1
redis> SMOVE myset myotherset "two"
(integer) 1
redis> SMEMBERS myset
1) "one"
redis> SMEMBERS myotherset
1) "two"
2) "three"
redis>
SPOP key [count]
从 1.0.0 开始可用。
时间复杂度:没有计数参数 O(1),否则 O(N),其中 N 是传递计数的值。
从位于 的设置值存储中删除并返回一个或多个随机成员key。
此操作类似于SRANDMEMBER,从集合中返回一个或多个随机元素,但不删除它。
默认情况下,该命令会从集合中弹出一个成员。当提供可选count参数时,回复将由最多count成员组成,具体取决于集合的基数。
返回值
不带count参数调用时:
批量字符串回复:被移除的成员,或者nil何时key不存在。
当使用count参数调用时:
数组回复key:被移除的成员,或者当不存在时为空数组。
例子
redis> SADD myset "one"
(integer) 1
redis> SADD myset "two"
(integer) 1
redis> SADD myset "three"
(integer) 1
redis> SPOP myset
"three"
redis> SMEMBERS myset
1) "two"
2) "one"
redis> SADD myset "four"
(integer) 1
redis> SADD myset "five"
(integer) 1
redis> SPOP myset 3
1) "one"
2) "four"
3) "two"
redis> SMEMBERS myset
1) "five"
redis>
SRANDMEMBER key [count]
从 1.0.0 开始可用。
时间复杂度:没有计数参数 O(1),否则为 O(N),其中 N 是传递计数的绝对值。
当仅使用key参数调用时,从存储在的集合值中返回一个随机元素key。
如果提供的参数是正数,则返回一个不同元素count的数组。数组的长度是或集合的基数 ( SCARD ),以较低者为准。count
如果使用否定调用,则行为会发生变化,并且允许该命令多次count返回相同的元素。在这种情况下,返回元素的数量是指定的绝对值。count
返回值
Bulk string reply:没有附加count参数,该命令返回一个带有随机选择元素的 Bulk Reply,或者nil当key不存在时。
数组回复:当附加count参数被传递时,该命令返回一个元素数组,key如果不存在则返回一个空数组。
例子
redis> SADD myset one two three
(integer) 3
redis> SRANDMEMBER myset
"one"
redis> SRANDMEMBER myset 2
1) "one"
2) "two"
redis> SRANDMEMBER myset -5
1) "one"
2) "two"
3) "two"
4) "two"
5) "three"
redis>
通过计数时的行为规范
当count参数为正值时,此命令的行为如下:
-
不返回重复的元素。
-
如果count大于集合的基数,则该命令将仅返回整个集合而不返回其他元素。
-
回复中元素的顺序并不是真正随机的,所以如果需要,由客户端来打乱它们。
当count为负值时,行为变化如下: -
重复元素是可能的。
-
如果集合为空(不存在的键),则始终返回确切count的元素或空数组。
-
回复中元素的顺序是真正随机的。
返回元素的分布
注意:本节仅适用于 Redis 5 或更低版本,因为 Redis 6 实现了更公平的算法。
当集合中的元素数量很少时,返回元素的分布远非完美,这是因为我们使用了一个近似的随机元素函数,并不能真正保证良好的分布。
使用的算法在 dict.c 中实现,对哈希表桶进行采样以找到一个非空的桶。一旦找到一个非空桶,由于我们在哈希表实现中使用了链接,因此检查桶内元素的数量并选择一个随机元素。
这意味着如果你在整个哈希表中有两个非空的桶,一个有三个元素,一个只有一个,那么单独在它的桶中的元素将被返回的概率要高得多。
历史
- Redis 版本 >= 2.6.0:添加了可选的
count
参数。
SREM key member [member ...]
从 1.0.0 开始可用。
时间复杂度: O(N),其中 N 是要删除的成员数。
从存储在的集合中删除指定的成员key。不属于该集合的指定成员将被忽略。如果key不存在,则将其视为空集并且此命令返回 0。
key当存储的值不是集合时返回错误。
返回值
整数回复:从集合中删除的成员数,不包括不存在的成员。
例子
redis> SADD myset "one"
(integer) 1
redis> SADD myset "two"
(integer) 1
redis> SADD myset "three"
(integer) 1
redis> SREM myset "one"
(integer) 1
redis> SREM myset "four"
(integer) 0
redis> SMEMBERS myset
1) "two"
2) "three"
redis>
## 历史
- Redis 版本 >= 2.4.0:接受多个 `member` 参数。```
# SSCAN key cursor [MATCH pattern] [COUNT count]
> 自 2.8.0 起可用。
> 时间复杂度:每次调用 O(1)。O(N) 用于完整的迭代,包括足够的命令调用以使光标返回 0。N 是集合内的元素数。
有关SSCAN文档,请参阅SCAN 。
# SUNION key [key ...]
> 从 1.0.0 开始可用。
> 时间复杂度: O(N),其中 N 是所有给定集合中元素的总数。
返回由所有给定集合的并集得到的集合成员。
例如:
key1 = {a,b,c,d}
key2 =
key3 = {a,c,e}
SUNION key1 key2 key3 = {a,b,c,d,e}
不存在的键被认为是空集。
## 返回值
数组回复:包含结果集成员的列表。
## 例子
redis> SADD key1 "a"
(integer) 1
redis> SADD key1 "b"
(integer) 1
redis> SADD key1 "c"
(integer) 1
redis> SADD key2 "c"
(integer) 1
redis> SADD key2 "d"
(integer) 1
redis> SADD key2 "e"
(integer) 1
redis> SUNION key1 key2
- "a"
- "b"
- "c"
- "e"
- "d"
redis>
# SUNIONSTORE destination key [key ...]
> 从 1.0.0 开始可用。
> 时间复杂度: O(N),其中 N 是所有给定集合中元素的总数。
此命令等同于SUNION,但不是返回结果集,而是存储在destination.
如果destination已经存在,则将其覆盖。
## 返回值
整数回复:结果集中的元素数。
## 例子
redis> SADD key1 "a"
(integer) 1
redis> SADD key1 "b"
(integer) 1
redis> SADD key1 "c"
(integer) 1
redis> SADD key2 "c"
(integer) 1
redis> SADD key2 "d"
(integer) 1
redis> SADD key2 "e"
(integer) 1
redis> SUNIONSTORE key key1 key2
(integer) 5
redis> SMEMBERS key
- "a"
- "b"
- "c"
- "e"
- "d"
redis>