srandmember

SRANDMEMBER

SRANDMEMBER key [count]

自1.0.0起可用。

时间复杂度:没有计数参数O(1),否则O(N)其中N是通过的计数的绝对值。

当仅用key参数调用时,从存储在的设置值返回一个随机元素key

从 Redis 版本2.6开始,当使用附加count参数调用时,如果为正值,则返回count 不同元素的数组count。如果调用负值,count则行为会发生更改,并且该命令可以多次返回相同的元素。在这种情况下,返回元素的数量是指定的绝对值count

当仅用关键参数调用时,操作与 SPOP 类似,但 SPOP 也会从集合中删除随机选择的元素,SRANDMEMBER 将只返回一个随机元素而不以任何方式更改原始集合。

返回值

散装串答复:没有附加count参数中的命令返回与所述随机选择的元件的散装回复,或nilkey不存在。数组回复:当count传递附加参数时,该命令返回一个元素数组,或者当一个空数组key不存在时。

例子

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

计数通过时的行为规范

当一个 count 参数被传递并且是肯定的时候,这些元素被返回,就好像每个被选中的元素都被从集合中移除一样(比如提取宾果游戏中的数字)。但是元素不会从 Set 中删除。所以基本上:

  • 没有重复的元素被返回。

  • 如果 count 大于 Set 内部的元素数量,则该命令将只返回整个集合而不包含其他元素。

如果计数是负数,则行为会发生变化,并且提取会发生,就好像在每次提取后再次将提取的元素放入包中一样,因此可能会重复元素,并且总是会返回请求的元素数量,因为我们可以重复相同的元素元素一次又一次,除了一个空的 Set(不存在的键),它总是会产生一个空数组。

返回元素的分配

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

使用的算法在 dict.c 中实现,对哈希表桶进行采样以找到非空的桶。一旦找到一个非空的桶,因为我们在我们的哈希表实现中使用链接,所以会检查桶内的元素数量并选择一个随机元素。

这意味着如果在整个散列表中有两个非空桶,并且一个有三个元素,而另一个只有一个,那么在桶中单独存在的元素将返回的概率要高得多。