我看到很多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命令就会分几种情况:
count = 0
: 取出的为空列表(empty array);count < Set size
:随机取出count个不重复的数据;count > Set size
:取出最大为Set size个数的数据,且取出的数据的顺序与使用SMEMBERS
命令取出此Set所有数据的顺序一致。
这就完了吗?不对!还有一种枚举!count可以为负数!!!
当count为负数的时候,将会随机取出abs(count)哥可重复的数据。无论它的绝对值是否大于Set size,都会取够足够数目的元素。
这个功能有什么用?
抽奖就是一个比较合适的例子,Set的值表示各类奖品。使用正数count即为每类奖品个数有限,抽完就没有了;而负数代表每类奖品可以抽取多个。