示例:抽奖

为了推销商品并反馈消费者,商家经常会举办一些抽奖活动,每个符合条件的消费者都可以参加这种抽奖,而商家则需要从所有参加抽奖的消费者里面选出指定数量的获奖者,并给他们赠送物品、金钱或者购物优惠。

代码清单 5-6 展示了一个使用集合实现的抽奖程序,这个程序会把所有参与抽奖活动的玩家都添加到一个集合里面,然后通过 SRANDMEMBER 命令随机地选出获奖者。


代码清单 5-6 使用集合实现的抽奖程序:/set/lottery.py

  1. class Lottery:
  2.  
  3. def __init__(self, client, key):
  4. self.client = client
  5. self.key = key
  6.  
  7. def add_player(self, user):
  8. """
  9. 将用户添加到抽奖名单当中。
  10. """
  11. self.client.sadd(self.key, user)
  12.  
  13. def get_all_players(self):
  14. """
  15. 返回参加抽奖活动的所有用户。
  16. """
  17. return self.client.smembers(self.key)
  18.  
  19. def player_count(self):
  20. """
  21. 返回参加抽奖活动的用户人数。
  22. """
  23. return self.client.scard(self.key)
  24.  
  25. def draw(self, number):
  26. """
  27. 抽取指定数量的获奖者。
  28. """
  29. return self.client.srandmember(self.key, number)

考虑到保留完整的抽奖者名单可能会有用,所以这个抽奖程序使用了随机地获取元素的 SRANDMEMBER 命令而不是随机地移除元素的 SPOP 命令;在不需要保留完整的抽奖者名单的情况下,我们也可以使用 SPOP 命令去实现抽奖程序。

以下代码简单地展示了这个抽奖程序的使用方法:

  1. >>> from redis import Redis
  2. >>> from lottery import Lottery
  3. >>> client = Redis(decode_responses=True)
  4. >>> lottery = Lottery(client, 'birthday party lottery') # 这是一次生日派对抽奖活动
  5. >>> lottery.add_player('peter') # 添加抽奖者
  6. >>> lottery.add_player('jack')
  7. >>> lottery.add_player('tom')
  8. >>> lottery.add_player('mary')
  9. >>> lottery.add_player('dan')
  10. >>> lottery.player_count() # 查看抽奖者数量
  11. 5
  12. >>> lottery.draw(1) # 抽取一名获奖者
  13. ['dan'] # dan 中奖了!