【问题标题】:Architeture of voting based website/app基于投票的网站/应用程序的架构
【发布时间】:2015-11-22 15:32:51
【问题描述】:

我正在开发一个网站。我想获得有关设计的反馈。网站功能类似于 Reddit、ProductHunt 等(即基于投票)。这是概述 1.后端服务从网络获取帖子并存储到数据库中。 2. 帖子显示在网站上(顶部,新)。 3.顶部显示基于排名(投票,时间因素)的网站。 4. 滚动时,用户会看到更多帖子

设计:

数据库表:帖子、用户、投票

后端服务: 后端服务定期从网络上获取帖子并存储到数据库(帖子表)中。

网站: 当用户访问网站时,用户会看到热门帖子。根据要求,网站代码查询数据库,该数据库返回根据时间和投票排名的链接。当使用投票特定帖子时,网站代码会将其添加到数据库中。网站允许登录并将用户信息存储在用户表中。

问题: 我应该考虑使用 Redis 缓存而不是查询数据库来获取每个请求的排名帖子吗?如果是,那么应该将什么存储到缓存中,更新缓存的逻辑应该是什么?

如果我最终使用缓存,那么缓存应该有两个条目。 1. 排名帖子 1. 新帖子。对于排名帖子,后端服务是否应该定期更新缓存?对于新帖子,每当从网络获取新帖子时,我是否应该使缓存无效?

如果我使用缓存路由,如何处理无限滚动?示例:用户根据排名查看帖子。用户在 15 分钟后滚动查看新帖子。到那时排名可能会改变。

如果有任何反馈/帮助,我将不胜感激!

【问题讨论】:

    标签: caching architecture redis


    【解决方案1】:

    我认为 Redis 将在性能方面为您提供很多帮助,您可以将它用作缓存,也可以用作真正的数据库(它拥有您需要的一切 - 持久性、备份、主从复制、服务器端集群) .
    如果您想将其用作缓存,您可以这样做:

    • 对于排名帖子,您可以使用Sorted Sets。这将允许您获得每个帖子的分数,这将是投票数,并且它将根据此分数对您的帖子进行排序。你有一个增加现有帖子分数的命令 - ZINCRBY。可以在更新数据库的同时更新缓存
    • 对于新帖子,您可以使用lists,因为您可以在创建新帖子时使用LPUSH轻松在列表前面添加元素,也可以使用LTRIM保持固定长度
    • 对于无限滚动,有更多的解决方案,都是有价格的:你可以使用命令ZRANGEBYSCORE和Limit参数来获取项目 已订购,因此如果在此期间发生某些变化,您可能不会显示它
    • 此外,当您需要以原子方式执行 2 个或更多命令时,例如,如果您希望创建的新帖子始终保持最新的 50 个,您需要将 LPUSH 和 LTRIM 作为一个命令调用,您可以执行此操作与LUA Scripting

    【讨论】:

    • 谢谢@Liviu!这确实很有帮助。我仍然无法弄清楚分页。举个例子:基于投票的有序集:a、b、x、g、d、e、c、f、y、s。基于投票的10个项目订单。页面显示 5 个项目。当用户滚动下一个 5 项目时,将显示。在用户滚动查看下一个项目之前,设置更改并因此设置发布顺序。新集合看起来像:a、b、f、y、x、g、s、d、e、c。前 5 名中的一些项目移动到下一个存储桶,第二页中的一些项目移动到第一个。滚动会给出重复的项目,也会错过一些项目。
    • 没有完美的解决方案,最简单的方法是在用户请求时创建快照(如果您有很多并发用户,这会消耗大量内存)。但是如果你想在服务器上有一个光标,你需要一些 id 来转发它而不是集合的大小。在您的情况下,如果分数只能上升,那么可以使用它。你在第一页收到的最后一个元素是 d,所以你需要记住它的分数,当你要求第二页时,你只要求从那个分数开始,所以你应该只收到 e 和 c,从而避免重复。 dev.twitter.com/rest/public/timelines
    猜你喜欢
    • 2011-06-13
    • 1970-01-01
    • 1970-01-01
    • 2011-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-22
    相关资源
    最近更新 更多