【问题标题】:Whats the best way to count views on a high traffic site?在高流量网站上计算观看次数的最佳方法是什么?
【发布时间】:2009-09-04 07:26:07
【问题描述】:

我目前在mysql中做的方式是

UPDATE table SET hits=hits+1 WHERE id = 1;

这会在网站上保留实时统计信息,但据我了解,这不是执行此操作的最佳方式。

编辑:

让我澄清一下...这是为了计算特定项目页面上的点击次数。我有一个电影列表,我想计算每个电影页面的观看次数。在它 +1 之后,它将电影 ID 添加到会话变量中,该变量记录了用户查看的所有页面的 ID。如果页面的 ID 在该数组中,则不会 +1。

【问题讨论】:

    标签: mysql


    【解决方案1】:

    如果您的流量足够高,您不应该在每次请求时都访问数据库。尝试将计数保留在内存中并按计划同步数据库(例如,每 1000 个请求或每分钟更新一次数据库。)

    【讨论】:

      【解决方案2】:

      您可以采用类似于Stack Overflow's view count 的方法。这基本上会在加载图像时增加计数器。这有两个有用的方面:

      • 机器人通常不下载图像,因此这些图像不会增加视图。
      • 浏览器会缓存图像,因此当您返回页面时,不会导致服务器工作。
      • 可能较慢的代码与页面的其余部分异步运行。这不会减慢页面的显示速度。

      要优化更新: * 将计数器保存在单个窄表中,并在键上使用聚集索引。 * 让表由不同的数据库服务器/主机提供服务。 * 使用 memcached 和/或队列来允许写入延迟或异步运行。

      如果您不需要实时显示观看次数,那么最好的办法是在您的 URL 中的某处包含电影 ID,并在一天结束时使用日志抓取来填充数据库。

      【讨论】:

        【解决方案3】:

        不确定您使用的是哪个网络服务器。

        如果您的网络服务器记录对站点的请求,请在文本文件中说每个请求一行。然后你可以只计算日志文件中的行数。

        您的解决方案有一个主要问题是它会锁定数据库中的行,因此您的站点一次只能处理一个请求。

        【讨论】:

        • 编辑了原始帖子以阐明我想要什么。
        【解决方案4】:

        这取决于你想要点击还是观看

        来自 1 个 ip 的 1 次浏览 = 1 个人查看一个页面 1 人刷新同一页面 = 多次点击但只有一次浏览

        我总是更喜欢谷歌分析等类似的东西,你需要确保 此数据库更新只进行一次,否则您很容易被淹没。

        【讨论】:

          【解决方案5】:

          我不确定您使用的是什么,但您可以设置一个 cron 作业以在 Google App Engine 中每 x 分钟自动更新一次计数。我认为您会使用 memcache 来保存计数,直到您的 cron 作业运行为止。虽然...... GAE 确实有一些统计报告,但您可能也希望拥有自己的数据。我认为您可以在其他系统上使用 memcache,并在它们上设置 cron 作业工具

          【讨论】:

            【解决方案6】:

            使用记录软件。 Google Analytics 非常漂亮且功能丰富(并且在您的服务器上生成零负载),但它会错过非 JavaScript 命中。如果每次点击都很重要,请使用 webalizer 或 awstats 等服务器日志分析器。

            【讨论】:

              【解决方案7】:

              一般情况下使用 MySQL:

              • 如果您使用 MyISAM 表:表上有锁,因此您最好在单独的表中执行 INSERT。然后使用 cron 作业,更新电影表中的值。
              • 如果您使用 InnoDB 表:行上有一个锁,因此您可以直接 UPDATE 值。

              也就是说,根据您项目的“成熟度”和成功程度,您可能需要实施不同的解决方案,因此:

              第一个建议:基准,基准,基准。

              第二条建议:使用来自第一条建议的数据,确定瓶颈并为您面临的问题选择解决方案,而不是您认为未来可能遇到的问题。

              这是一个很棒的视频:http://www.youtube.com/watch?v=ZW5_eEKEC28

              希望这会有所帮助。 :)

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2012-11-01
                • 2012-03-04
                • 1970-01-01
                • 2010-09-14
                • 1970-01-01
                • 2023-03-28
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多