Redis 实战 巧妙的方案(1)

作者 : 开心源码 本文共940个字,预计阅读时间需要3分钟 发布时间: 2022-05-12 共172人阅读

情景形容

对文章进行投票

  1. 一篇文章取得至少200张支持票认为是一篇有趣的文章
  2. 网站每天发布1000篇文章,其中50篇符合有趣的文章
  3. 网站要把这50篇文章放到文章列表的前100位一天
  4. 网站暂时不支持投反对票
  5. 文章评分等于得到支持票数量*一个常量(432,一天的秒数/文章展现一天所需的支持票数量(200)得出)+文章发布时间(时间使用1970年1月1日到现在为止的秒数)
  6. 除了需要计算文章评分之外,还需要使用Redis结构存储网站上的各种信息。

方案:

  1. 两个有序集合(zset)存储文章,一个有序集合的成员是文章ID,分值为文章的发布时间;一个有序集合的成员也是文章ID,分值为文章的评分。我们既可以根据文章的评分高低展现文章,也可以根据文章发布的时间展现文章。
  2. 为防止客户对同一篇文章进行屡次投票,每篇文章记录一个已投票客户名单,为每一篇文章创立一个集合,存储每一篇文章的所有已投票客户ID;文章发布期满一周之后,客户将不能进行投票,记录文章存储投票的客户名单的集合删除。
  3. 投票流程:zscore 检查文章发布时间集合,判断文章的发布时间能否操作一周,若可投票,sadd 尝试客户增加文章投票客户集合,若增加成功,zincrby 给文章的评分添加432分,同时使用hincrby给文章投票数量进行升级。
  4. 发布并获取文章:创立文章ID,使用计数器执行incr完成,使用sadd 将文章发布者的ID增加到记录文章已投票客户集合,并使用expire 设置集合的过期时间,用hmset存储文章的相关内容,并执行两个zadd 将文章的初始评分和发布时间增加到相应的有序集合中。使用zrevrange 取评分最高和最新发布的文章,再用hgetall 取文章的详细信息,(Zset 默认从小到大排,所以用zrevrang 反转取从大到小排)
  5. 文章分组,(比方和XX标签有关的文章):群组分为两部分组成:一部分负责记录文章属于哪个群组,另一部分负责取出群组里面的文章;我们需要为每一个群组创立一个集合,同属于一个群组的文章ID放在一个集合中,为了能够根据评分对群组文章进行排序和分页,我们需要将一个群组里面所有的文章按照评分有序的存储到一个有序集合里面,zinterstore支持多集合取交集合并。就能处理评分对群组文章进行排序和分页的逻辑。

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » Redis 实战 巧妙的方案(1)

发表回复