【问题标题】:Generating scoreboards on large traffic sites在大流量网站上生成记分牌
【发布时间】:2010-06-21 13:21:08
【问题描述】:

有点奇怪的问题,但我希望有人能指出我正确的方向。基本上我有两种情况,我想知道哪一种最适合我的情况(用户在高流量网站上查看记分牌)。

  1. 每次用户点击页面时都会重新生成前 10 名 - 服务器负载增加,尤其是在高流量时,用户将尽快看到他/她的正确位置。
  2. 前 10 名以设定的时间间隔重新生成,例如每 10 分钟一次。 - 仅生成一组结果,每 10 分钟导致一次峰值,而不是可能每 x 秒一次,如果用户在刷新之间点击,他们将看不到更新后的分数。

每一种都有其优点和缺点,根据您的经验,哪一种最适合使用,或者是否有任何神奇的替代方法?

编辑 - 一个更新,在接受了大家所说的之后,我决定重建这部分应用程序。我处理的是总数,而不是处理单个分数,然后将其保存到一个单独的表中,该表的作用类似于缓存数据源。

感谢大家的宝贵意见。

【问题讨论】:

  • 记分牌是如何生成的?我认为理想的解决方案介于两者之间:仅在需要合并新数据时生成记分卡。

标签: php usability


【解决方案1】:

除了 Marcel 的回答之外,我建议仅在写入事件时更新记分牌(例如新分数或删除分数)。这样,您可以为热门查询(例如 Top 10 等)保留静态答案。使用 MemCache 之类的东西来为请求保留数据缓存,或者如果您不/不能在服务器上安装 MemCache 之类的东西,则序列化常见请求并编写它们到平面文件,然后在写入事件时删除/更新它们。让您的代码先查找缓存的结果(或文件),然后如果它丢失,则执行查询并创建数据

【讨论】:

  • 这样,您可以获得“实时”结果并最大限度地减少重新计算或数据库查询的负载
  • 我重构了系统来做到这一点。结果现在缓存 15 分钟,并且仅在将新分数添加到系统时才会访问数据库。再次感谢所有伟大的建议和帮助。
【解决方案2】:

在网络方面,没有什么是不需要实时的。我会选择选项 2,用户不会注意到分数没有变化。每次缓存清空可以用一些JS刷新前10

【讨论】:

    【解决方案3】:

    补充Jordan 的建议:我会将记分卡放在一个单独的(HTML 格式)文件中,每次新数据到达时才会生成该文件。您可以将此文件包含在包含记分卡的 PHP 页面中,甚至可以让访问者的浏览器使用 XMLHttpRequests 定期获取它(以节省带宽)。禁用 JavaScript 或使用不支持 XMLHttpRequests 的浏览器(现在很少见,但可能)的用户只会看到一个静态页面。

    【讨论】:

      【解决方案4】:

      Drupal 投票模块会为您处理这个问题,让您可以选择何时重新计算。如果您自己实现它,那么在某处缓存前 10 个是一个好主意 - 您可以定期重新生成它,也可以在某些点使缓存无效。您需要查看人们投票的频率、导致前 10 名更改的频率、前 10 名页面的查看频率以及重新生成它所涉及的性能影响。

      如果您没有设置 Drupal/MySQL,那么 CouchDB 在这里会很有用。您可以创建一个计算前 10 个数据的视图,并将其缓存,直到发生导致需要重新计算的情况。您还可以嵌入一个 http 缓存代理,以将结果缓存设定的分钟数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-04-30
        • 1970-01-01
        • 2014-06-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-21
        相关资源
        最近更新 更多