1、对文章进行投票

要构建一个文章投票网站,我们首先要做的就是为了这个网站设置一些数值和限制条件:如果一篇文章获得了至少200张支持票,那么久认为这篇文章是【有趣的】。假如这个网站每天发布1000篇文章,而其中的50篇符合网站对【有趣】文章的要求,那么网站要做的就是把这50篇文章放到文章放到文章列表前100位至少一天;另外,这个网站暂时不提供投反对票的功能。

为了产生一个能够随着时间流逝而不断减少的评分,程序需要根据文章的发布时间和当前时间来计算文章的评分,具体的计算方法为:将文章得到的支持票数乘以一个常量,然后加上文章的发布时间,得出的结果就是文章的评分。

我们使用从UTC时区1970年1月1日到现在为止所经过的秒数来计算文章的评分,这个值通常被成为Unix时间。之所以选择使用Unix时间,是因为所有能够运行Redis的平台上面,使用编程语言获取这个值都是非常简单的事情。另外,计算评分时与支持数量相乘的常量为432,这个常量是通过将一天的秒数(86400)除以文章展示一天所需的支持票数量(200得出的):文章没获得一张支持票,程序就需要将程序的评分增加432分。

构建文章投票网站除了需要计算文章评分之外,还需要使用Redis结构存储网站上的各种信息。对于网站里的每一篇文章,程序都使用了一个散列来存储文章的标题、指向文章的网址、发布文章的用户、文章的发布时间、文章得到的投票数量等信息。

我们的文章投票网站将使用两个有序集合来存储文章:

  • 第一个有序集合的成员为:文章ID、文章的发布时间,该有序集合可以使网站按照发布时间先后展示文章
  • 第二个有序集合的成员为:文章ID、文章的评分,该有序集合可以使网站按照评分高低展示文章。

为了防止用户对同一篇文章进行多次投票,网站需要为每一篇文章记录一个已投票用户名单。为此,需要创建一个存储所有已经投票的用户ID。

为了尽量节约内存,我们规定当一篇文章发布期满一周之后,用户将不能再对它进行投票,文章的评分将被固定下来,而积累文章已经投票用户名单的集合会被删除。

既然我们已经知道了网站计算文章评分的方法,也知道了网站存储数据所需的数据结构,那么现在是时候实际的实现这个投票功能了!

  • 当用户尝试对一篇文章进行投票时,程序需要使用zscore命令来检查记录文章发布时间的有序集合,判断文章的发布时间是否未超过一周。
  • 如果文章仍然处于可以投票的时间范围之内,那么程序将使用sadd命令,尝试将用户添加到记录文章已经投票用户名单集合里。
  • 如果添加操作执行成功的话,那么说明用户是第一次对这篇文章进行投票,程序将使用zincrby命令为文章的评分增加432分(zincrby命令用于对有序集合成员的分值进行自增操作),并使用hincrby命令对散列记录的文章投票数量进行更新(hincrby命令用于对散列存储的值执行自增操作)。
投票功能实现代码:
import time

ONE_WEEK_IN_SECONDS=7*86400  #一周秒数
VOTE_SCORE=432  #点赞一次增加的分值

#投票
def article_vote(conn,user,article):
    cutoff=time.time()-ONE_WEEK_IN_SECONDS
    #提示:本案例使用冒号作为分隔符
    if conn.zscore('time:',article)<cutoff:
        #判断文章发布时间是否已经超过七天
        return

    article_id=article.partition(':')[-1]
    if conn.sadd('voted:'+article_id,user):
        #如果用户是第一次为文章投票,那么增加这篇文章的投票数量和评分
        conn.zincrby('score:',article,VOTE_SCORE)
        conn.hincrby(article,'votes',1)

results matching ""

    No results matching ""