Redis SRANDMEMBER命令

只传递key参数调用时,从key处存储的集合中返回一个随机元素。

从Redis版本2.6开始,当调用时使用了count参数,如果count为正,则返回由count个不同元素组成的数组。 如果调用的count参数为负,会有不同的行为,命令可以多次返回同一元素。 返回的元素数是指定的参数count的绝对值。

仅使用key参数调用时,操作类似于SPOP命令,不同的是SPOP命令会从集合中删除随机选择的元素,而SRANDMEMBER命令只会返回一个随机元素,不会以任何方式更改原始集合。

可用版本:从1.0.0开始可用
时间复杂度:没有count参数时为O(1),有count参数时为O(N),其中N是参数count的绝对值。

命令格式

SRANDMEMBER key [count]

示例

redis> SADD myset one two three
(integer) 3
redis> SRANDMEMBER myset
"three"
redis> SRANDMEMBER myset 2
1) "one"
2) "three"
redis> SRANDMEMBER myset -5
1) "three"
2) "three"
3) "two"
4) "one"
5) "three"

返回值

如果没有传递count参数,则该命令将返回随机选择的元素,如果key不存在,则返回nil。 如果传递了count参数时,该命令将返回一个元素数组,当key不存在时返回一个空数组。

用法

当传递了count参数时的行为

当传递了一个count参数并且为正数时,选取元素过的元素就不会再次被选取,就像它被从集合中删除了一样。但实际上此操作不会从集合中删除元素。所以:

  • 没有重复的元素被返回。
  • 如果count大于Set中元素的数量,则该命令将仅返回整个集合。

与之相反,当count为负时,会有不同的行为,选取发生时就好像是在每次选取后再将选取的元素再次放回一样,因此可能有重复的元素,并且总是返回请求的元素数,因为我们可以重复选取操作无数遍,但空的Set(或key不存在)时例外,它将始终返回一个空数组。

返回元素的分布 当集合中的元素数量很少时,返回元素的分布远非完美,这是因为:我们使用了近似的随机函数,并不能保证良好的分布。