情景描述
对文章进行投票
- 一篇文章获得至少200张支持票认为是一篇有趣的文章
- 网站每天发布1000篇文章,其中50篇符合有趣的文章
- 网站要把这50篇文章放到文章列表的前100位一天
- 网站暂时不支持投反对票
- 文章评分等于得到支持票数量*一个常量(432,一天的秒数/文章展示一天所需的支持票数量(200)得出)+文章发布时间(时间使用1970年1月1日到现在为止的秒数)
- 除了需要计算文章评分之外,还需要使用Redis结构存储网站上的各种信息。
方案:
- 两个有序集合(zset)存储文章,一个有序集合的成员是文章ID,分值为文章的发布时间;一个有序集合的成员也是文章ID,分值为文章的评分。我们既可以根据文章的评分高低展示文章,也可以根据文章发布的时间展示文章。
- 为防止用户对同一篇文章进行多次投票,每篇文章记录一个已投票用户名单,为每一篇文章创建一个集合,存储每一篇文章的所有已投票用户ID;文章发布期满一周之后,用户将不能进行投票,记录文章存储投票的用户名单的集合删除。
- 投票流程:zscore 检查文章发布时间集合,判断文章的发布时间是否操作一周,若可投票,sadd 尝试用户添加文章投票用户集合,若添加成功,zincrby 给文章的评分增加432分,同时使用hincrby给文章投票数量进行更新。
- 发布并获取文章:创建文章ID,使用计数器执行incr完成,使用sadd 将文章发布者的ID添加到记录文章已投票用户集合,并使用expire 设置集合的过期时间,用hmset存储文章的相关内容,并执行两个zadd 将文章的初始评分和发布时间添加到相应的有序集合中。使用zrevrange 取评分最高和最新发布的文章,再用hgetall 取文章的详细信息,(Zset 默认从小到大排,所以用zrevrang 反转取从大到小排)
- 文章分组,(比如和XX标签有关的文章):群组分为两部分组成:一部分负责记录文章属于哪个群组,另一部分负责取出群组里面的文章;我们需要为每一个群组创建一个集合,同属于一个群组的文章ID放在一个集合中,为了能够根据评分对群组文章进行排序和分页,我们需要将一个群组里面所有的文章按照评分有序的存储到一个有序集合里面,zinterstore支持多集合取交集合并。就能解决评分对群组文章进行排序和分页的逻辑。
网友评论