使用Redis Set实现抽奖小程序

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

1、Redis Set相关命令

1.1、SADD

1
SADD key member [member ...]

将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略。
假如 key 不存在,则创建一个只包含 member 元素作成员的集合。
当 key 不是集合类型时,返回一个错误。
在Redis2.4版本以前, SADD 只接受单个 member 值。
时间复杂度: O(N), N 是被添加的元素的数量。
返回值: 被添加到集合中的新元素的数量,不包括被忽略的元素。
示例:

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

1.2、SMEMBERS

1
SMEMBERS key

返回集合 key 中的所有成员。不存在的 key 被视为空集合。
时间复杂度:O(N), N 为集合的基数。
返回值: 集合中的所有成员。
示例:

1
2
3
4
5
6
7
8
9
10
11
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

1
SRANDMEMBER key [count]

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

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

返回值:

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

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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

1
SPOP key [count]

移除并返回集合中的count个随机元素。count为可选参数,没有提供的话,只移除并返回集合中的一个随机元素。
如果只想获取随机元素,不想该元素从集合中被移除,可以使用 SRANDMEMBER 命令。
时间复杂度: O(1)
返回值:

被移除的随机元素。
当 key 不存在或 key 是空集时,返回 nil 。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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实现抽奖小程序

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

1
SADD key {userId...}


查看参与抽奖的人员:

1
SMEMBERS key

获取中奖人员:

1
SRANDMEMBER key [count]

1
SPOP key [count]

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


使用Redis Set实现抽奖小程序
https://river106.cn/posts/b2b8ac69.html
作者
river106
发布于
2022年2月26日
许可协议