示例:点赞
为了让用户表达自己对某一项内容的喜欢和赞赏之情,很多网站都提供了点赞(like)功能:通过这一功能,用户可以给自己喜欢的内容进行点赞,也可以查看给相同内容进行了点赞的其他用户,还可以查看给相同内容进行点赞的用户数量,诸如此类。
除了点赞之外,很多网站还有诸如“+1”、“顶”、“喜欢”等功能,这些功能的名字虽然各有不同,但它们在本质上和点赞功能是一样的。
代码清单 5-3 展示了一个使用集合实现的点赞程序,这个程序使用集合来储存对内容进行了点赞的用户,从而确保每个用户只能对同一内容点赞一次,并通过使用不同的集合命令来实现查看点赞数量、查看所有点赞用户以及取消点赞等功能。
代码清单 5-3 使用集合实现的点赞程序:/set/like.py
- class Like:
- def __init__(self, client, key):
- self.client = client
- self.key = key
- def cast(self, user):
- """
- 用户尝试进行点赞。
- 如果此次点赞执行成功,那么返回 True ;
- 如果用户之前已经点过赞,那么返回 False 表示此次点赞无效。
- """
- return self.client.sadd(self.key, user) == 1
- def undo(self, user):
- """
- 取消用户的点赞。
- """
- self.client.srem(self.key, user)
- def is_liked(self, user):
- """
- 检查用户是否已经点过赞。
- 是的话返回 True ,否则的话返回 False 。
- """
- return self.client.sismember(self.key, user)
- def get_all_liked_users(self):
- """
- 返回所有已经点过赞的用户。
- """
- return self.client.smembers(self.key)
- def count(self):
- """
- 返回已点赞用户的人数。
- """
- return self.client.scard(self.key)
以下代码展示了如何使用点赞程序去记录一篇帖子的点赞信息:
- >>> from redis import Redis
- >>> from like import Like
- >>> client = Redis(decode_responses=True)
- >>> like_topic = Like(client, 'topic::10086::like')
- >>> like_topic.cast('peter') # 用户对帖子进行点赞
- True
- >>> like_topic.cast('john')
- True
- >>> like_topic.cast('mary')
- True
- >>> like_topic.get_all_liked_users() # 获取所有为帖子点过赞的用户
- set(['john', 'peter', 'mary'])
- >>> like_topic.count() # 获取为帖子点过赞的用户数量
- 3
- >>> like_topic.is_liked('peter') # peter 为帖子点过赞了
- True
- >>> like_topic.is_liked('dan') # dan 还没有为帖子点过赞
- False