示例:抽奖
为了推销商品并反馈消费者,商家经常会举办一些抽奖活动,每个符合条件的消费者都可以参加这种抽奖,而商家则需要从所有参加抽奖的消费者里面选出指定数量的获奖者,并给他们赠送物品、金钱或者购物优惠。
代码清单 5-6 展示了一个使用集合实现的抽奖程序,这个程序会把所有参与抽奖活动的玩家都添加到一个集合里面,然后通过 SRANDMEMBER
命令随机地选出获奖者。
代码清单 5-6 使用集合实现的抽奖程序:/set/lottery.py
- class Lottery:
- def __init__(self, client, key):
- self.client = client
- self.key = key
- def add_player(self, user):
- """
- 将用户添加到抽奖名单当中。
- """
- self.client.sadd(self.key, user)
- def get_all_players(self):
- """
- 返回参加抽奖活动的所有用户。
- """
- return self.client.smembers(self.key)
- def player_count(self):
- """
- 返回参加抽奖活动的用户人数。
- """
- return self.client.scard(self.key)
- def draw(self, number):
- """
- 抽取指定数量的获奖者。
- """
- return self.client.srandmember(self.key, number)
考虑到保留完整的抽奖者名单可能会有用,所以这个抽奖程序使用了随机地获取元素的 SRANDMEMBER
命令而不是随机地移除元素的 SPOP
命令;在不需要保留完整的抽奖者名单的情况下,我们也可以使用 SPOP
命令去实现抽奖程序。
以下代码简单地展示了这个抽奖程序的使用方法:
- >>> from redis import Redis
- >>> from lottery import Lottery
- >>> client = Redis(decode_responses=True)
- >>> lottery = Lottery(client, 'birthday party lottery') # 这是一次生日派对抽奖活动
- >>> lottery.add_player('peter') # 添加抽奖者
- >>> lottery.add_player('jack')
- >>> lottery.add_player('tom')
- >>> lottery.add_player('mary')
- >>> lottery.add_player('dan')
- >>> lottery.player_count() # 查看抽奖者数量
- 5
- >>> lottery.draw(1) # 抽取一名获奖者
- ['dan'] # dan 中奖了!