使用Redis Set实现抽奖小程序,先介绍Set的相关命令。

1、Redis Set相关命令

1.1 SADD

SADD key member [member ...]

将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略。

假如 key 不存在,则创建一个只包含 member 元素作成员的集合。

当 key 不是集合类型时,返回一个错误。

在Redis2.4版本以前, SADD 只接受单个 member 值。

时间复杂度: O(N), N 是被添加的元素的数量。

返回值: 被添加到集合中的新元素的数量,不包括被忽略的元素。

示例:


127.0.0.1:6379> sadd luckydraw 111 222 333 444 555 666 777 888 999 000
(integer) 10


1.2、SMEMBERS

SMEMBERS key

返回集合 key 中的所有成员。不存在的 key 被视为空集合。

时间复杂度:O(N), N 为集合的基数。

返回值: 集合中的所有成员。

示例:

127.0.0.1:6379> smembers luckydraw
 1) "777"
 2) "222"
 3) "666"
 4) "555"
 5) "000"
 6) "888"
 7) "333"
 8) "111"
 9) "444"
10) "999"

1.3、SRANDMEMBER


SRANDMEMBER key [count]


随机返回集合中的count个参数,count为可选参数,没有提供的话,只返回集合中的一个随机元素。

时间复杂度:

只提供 key 参数时为 O(1) 。

如果提供了 count 参数,那么为 O(N) ,N 为返回数组的元素个数。

返回值:

只提供 key 参数时,返回一个元素;如果集合为空,返回 nil 。

如果提供了 count 参数,那么返回一个数组;如果集合为空,返回空数组。

示例:


127.0.0.1:6379> sadd luckydraw 111 222 333 444 555 666 777 888 999 000
(integer) 10
127.0.0.1:6379> srandmember luckydraw
"999"
127.0.0.1:6379> srandmember luckydraw 2
1) "333"
2) "111"
127.0.0.1:6379> srandmember luckydraw 3
1) "222"
2) "777"
3) "333"
127.0.0.1:6379> srandmember luckydraw 4
1) "222"
2) "777"
3) "666"
4) "333"


1.4、SPOP


SPOP key [count]


移除并返回集合中的count个随机元素。count为可选参数,没有提供的话,只移除并返回集合中的一个随机元素。

如果只想获取随机元素,不想该元素从集合中被移除,可以使用 SRANDMEMBER 命令。

时间复杂度: O(1)

返回值:

被移除的随机元素。

当 key 不存在或 key 是空集时,返回 nil 。

示例:


127.0.0.1:6379> spop luckydraw 1
1) "444"
127.0.0.1:6379> spop luckydraw 2
1) "666"
2) "777"
127.0.0.1:6379> spop luckydraw 3
1) "111"
2) "000"
3) "333"
127.0.0.1:6379> spop luckydraw 4
1) "222"
2) "555"
3) "888"
4) "999"
127.0.0.1:6379> spop luckydraw 
(nil)


2、使用redis实现抽奖小程序

将参与抽奖的人员加入集合:


SADD key {userId}


查看参与抽奖的人员:

SMEMBERS key

获取中奖人员:

SRANDMEMBER key [count]

SPOP key [count]

像微信抽奖小程序中抽取单个奖品可以使用SRANDMEMBER;如果是年会中的抽奖分一等奖、二等奖、三等奖...抽了三等奖的就不允许再抽其他奖,这个时候就需要使用SPOP,抽中了某个奖品后从人员集合中删除。