使用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,抽中了某个奖品后从人员集合中删除。