示例:点赞

为了让用户表达自己对某一项内容的喜欢和赞赏之情,很多网站都提供了点赞(like)功能:通过这一功能,用户可以给自己喜欢的内容进行点赞,也可以查看给相同内容进行了点赞的其他用户,还可以查看给相同内容进行点赞的用户数量,诸如此类。

除了点赞之外,很多网站还有诸如“+1”、“顶”、“喜欢”等功能,这些功能的名字虽然各有不同,但它们在本质上和点赞功能是一样的。

代码清单 5-3 展示了一个使用集合实现的点赞程序,这个程序使用集合来储存对内容进行了点赞的用户,从而确保每个用户只能对同一内容点赞一次,并通过使用不同的集合命令来实现查看点赞数量、查看所有点赞用户以及取消点赞等功能。


代码清单 5-3 使用集合实现的点赞程序:/set/like.py

  1. class Like:
  2.  
  3. def __init__(self, client, key):
  4. self.client = client
  5. self.key = key
  6.  
  7. def cast(self, user):
  8. """
  9. 用户尝试进行点赞。
  10. 如果此次点赞执行成功,那么返回 True ;
  11. 如果用户之前已经点过赞,那么返回 False 表示此次点赞无效。
  12. """
  13. return self.client.sadd(self.key, user) == 1
  14.  
  15. def undo(self, user):
  16. """
  17. 取消用户的点赞。
  18. """
  19. self.client.srem(self.key, user)
  20.  
  21. def is_liked(self, user):
  22. """
  23. 检查用户是否已经点过赞。
  24. 是的话返回 True ,否则的话返回 False 。
  25. """
  26. return self.client.sismember(self.key, user)
  27.  
  28. def get_all_liked_users(self):
  29. """
  30. 返回所有已经点过赞的用户。
  31. """
  32. return self.client.smembers(self.key)
  33.  
  34. def count(self):
  35. """
  36. 返回已点赞用户的人数。
  37. """
  38. return self.client.scard(self.key)

以下代码展示了如何使用点赞程序去记录一篇帖子的点赞信息:

  1. >>> from redis import Redis
  2. >>> from like import Like
  3. >>> client = Redis(decode_responses=True)
  4. >>> like_topic = Like(client, 'topic::10086::like')
  5. >>> like_topic.cast('peter') # 用户对帖子进行点赞
  6. True
  7. >>> like_topic.cast('john')
  8. True
  9. >>> like_topic.cast('mary')
  10. True
  11. >>> like_topic.get_all_liked_users() # 获取所有为帖子点过赞的用户
  12. set(['john', 'peter', 'mary'])
  13. >>> like_topic.count() # 获取为帖子点过赞的用户数量
  14. 3
  15. >>> like_topic.is_liked('peter') # peter 为帖子点过赞了
  16. True
  17. >>> like_topic.is_liked('dan') # dan 还没有为帖子点过赞
  18. False