要发布文章,我们首先使用 INCR 递增计数器来创建文章 ID。然后,我们通过使用 SADD 将发布者的 ID 添加到 SET 来创建投票 SET。为了确保 SET 在一周后被删除,我们将使用 EXPIRE 命令为其设置过期时间,这将允许 Redis 自动删除它。然后,我们使用 HMSET 存储文章信息。最后,我们使用 ZADD 将初始得分和发布时间添加到相关的 ZSET 中。我们可以在清单 1.7 中看到发布文章的代码。
def post_article(conn, user, title, link):
article_id = str(conn.incr('article:'))
生成一个新的文章 ID。
voted = 'voted:' + article_id
conn.sadd(voted, user) conn.expire(voted, ONE_WEEK_IN_SECONDS)
首先,让发布用户投票支持该文章,并将文章投票信息设置为在一周后自动过期(我们将在第 3 章中讨论过期)。
now = time.time() article = 'article:' + article_id
conn.hmset(article, { 'title': title, 'link': link, 'poster': user, 'time': now, 'votes': 1, })
创建文章哈希。
conn.zadd('score:', article, now + VOTE_SCORE) conn.zadd('time:', article, now)
将文章添加到按时间和得分排序的 ZSET 中。
return article_id
好的,所以我们可以投票,也可以发布文章。但是如何获取当前得分最高或最新的文章呢?为此,我们可以使用 ZRANGE 来获取文章 ID,然后我们可以调用 HGETALL 来获取有关每篇文章的信息。唯一棘手的部分是我们必须记住 ZSET 是按其得分升序排序的。但是我们可以使用 ZREVRANGEBYSCORE 基于反向顺序获取项目。获取文章页面的函数如清单 1.8 所示。
ARTICLES_PER_PAGE = 25 def get_articles(conn, page, order='score:'):
start = (page-1) * ARTICLES_PER_PAGE end = start + ARTICLES_PER_PAGE - 1
设置用于获取文章的起始和结束索引。
ids = conn.zrevrange(order, start, end)
获取文章 ID。
articles = []
for id in ids: article_data = conn.hgetall(id) article_data['id'] = id articles.append(article_data)
从文章 ID 列表中获取文章信息。
return articles
默认参数和关键字参数
在清单 1.8 中,我们使用了一个名为 order 的参数,并给它一个默认值 score:。对于 Python 语言的新手来说,默认参数的一些细节以及作为名称传递参数(而不是通过位置)可能会很奇怪。如果您在理解函数定义或参数传递方面遇到困难,Python 语言教程提供了一个很好的介绍,您可以访问此缩短的 URL 直接跳转到特定部分:https://mng.bz/KM5x。
我们现在可以获得整个网站中得分最高的文章。但是这些文章投票网站中的许多都有一些仅处理特定主题文章的群组,例如可爱的动物、政治、Java 编程,甚至包括 Redis 的使用。我们如何添加或更改我们的代码以提供这些主题组?