Redis Set中 SRANDMEMBER 详解

Source

我看到很多Redis相关文章中对Set的SRANDMEMBER方法描述过于简单,并未枚举出所有的情况。因此有此文。


方法基本描述

我们使用redis-cli命令进入redis客户端,使用help @set命令去看Set中的各个方法,能获得SRANDMEMBER的一个基本描述:

SRANDMEMBER key [count]
summary: Get one or multiple random members from a set
since: 1.0.0

翻译过来就是:从一个Set中随机取n个值。


实战一下

众所周知,Set类型的元素是不会重复且无序的,例如我们使用如下命令给名为k1的key增添值

sadd k1 a b c d e f g a c

实际上只会添加a到g共7个元素。

这个时候我们使用SRANDMEMBER命令就会分几种情况:

  1. count = 0: 取出的为空列表(empty array);
  2. count < Set size:随机取出count个不重复的数据;
  3. count > Set size:取出最大为Set size个数的数据,且取出的数据的顺序与使用SMEMBERS命令取出此Set所有数据的顺序一致。

这就完了吗?不对!还有一种枚举!count可以为负数!!!
当count为负数的时候,将会随机取出abs(count)哥可重复的数据。无论它的绝对值是否大于Set size,都会取够足够数目的元素。


这个功能有什么用?

抽奖就是一个比较合适的例子,Set的值表示各类奖品。使用正数count即为每类奖品个数有限,抽完就没有了;而负数代表每类奖品可以抽取多个。