基于投票的网站/应用程序的基础架构

时间:2015-08-28 04:01:08

标签: caching architecture redis

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

设计

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

后端服务: 后端服务定期从Web中提取帖子并存储到DB(帖子表)中。

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

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

如果我最终使用缓存,那么缓存应该有两个条目。 1.排名帖子1.新职位。对于排名帖子应该定期后端服务更新缓存?对于新帖子,我应该在每次从网络上发布新帖子时使缓存失效吗?

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

感谢任何反馈/帮助!

1 个答案:

答案 0 :(得分:0)

我认为Redis会在性能方面给你很多帮助,你可以将它用作缓存,也可以用作真正的数据库(它拥有你需要的一切 - 持久性,备份,主从复制,服务器端集群) 。
如果要将其用作缓存,可以执行以下操作:

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