问题 如何实现特定页面的视图数量


所以基本上我想实现与stackoverflow相同的功能:

viewed 59344 times

所以这里有一些背景信息:

  1. 我想只计算独特的访问次数。假设注册用户多次阅读文章(正在发展)
  2. 我使用MongoDB作为商店
  3. 我希望它接近实时
  4. 我的系统将有一个注册,但我也想计算匿名用户的意见

我知道计算唯一访问次数的最佳方式是通过注册,但事实是,大量用户将只是被动读者,他们不需要创建帐户来从应用程序中读取信息。据我了解,最方便的方法是保存阅读帖子的每个用户的IP地址。我也明白IP地址不会提供唯一性(一些不同的用户将具有相同的IP,因为它们位于同一ISP后面,一个用户可以拥有不同的IP,通过使用代理,等等)

使用Mongo并不是绝对必要的,只是因为现在所有东西都是用Mongo编写的,所以只有当它更快/更方便时才会切换。


7855
2018-03-26 13:47


起源



答案:


背景

你是 某些 你需要追踪“独特”的观点吗?

我实际上不希望热门网站试图保持视图计数的独特性 - 更大更好,重新访问新评论仍然是显示新内容/评论/广告意义上的额外“观点”。 “正确性”还有其他可能的微妙之处,可能对您的用例很重要,也可能不重要,例如排除爬虫或您自己公司的用户/ IP。

我没有花时间跟踪唯一视图(这不是太有意义),而是考虑计算页面上的独特用户交互,例如投票/喜欢/评论。然后,您可以根据这些指标确定某个公式的“受欢迎程度”。这个方法有一个有趣的例子 Drupal的放射性模块,其中基于基于用户交互的新近度的活动计算“热度”度量。

要考虑的方法

1)对于MongoDB中的简单视图计数器,我会使用 $inc 在加载页面时增加视图计数。您可以根据需要按角色排除日志记录用户(例如管理员用户)。

2)对于更准确的视图计数器,我会将问题传递给a 网站分析 平台(您应该与您的网站一起使用以进行更详细的分析)。例如,您可以使用 Google AnalyticsAPI 或像开源应用程序 Piwik。 Web分析系统已经有了用于确定唯一用户/视图的解决方案,并且这些API调用可以通过JavaScript异步进行。

3)如果实现自己独特的视图跟踪一个明确的要求,我会使用一个单独的集合来跟踪视图和 UPSERT 根据您的独特性标准(每个独特的视图 user,article 对注册用户或 session_id,article 配对anon用户)。如果upsert导致插入,我会通过递增文章视图的计数器将其与方法#1(为文章视图递增视图计数器)结合起来。


15
2018-03-29 06:17



+1。此线程中的最佳解决方案(如选项3所述)。任何将无界限推入数组的解决方案都会遇到性能和大小限制问题。 - Remon van Vliet
@SalvadorDali:有一个有趣的元讨论 Stack Overflow如何计算问题中的视图数量?。 - Stennie


答案:


背景

你是 某些 你需要追踪“独特”的观点吗?

我实际上不希望热门网站试图保持视图计数的独特性 - 更大更好,重新访问新评论仍然是显示新内容/评论/广告意义上的额外“观点”。 “正确性”还有其他可能的微妙之处,可能对您的用例很重要,也可能不重要,例如排除爬虫或您自己公司的用户/ IP。

我没有花时间跟踪唯一视图(这不是太有意义),而是考虑计算页面上的独特用户交互,例如投票/喜欢/评论。然后,您可以根据这些指标确定某个公式的“受欢迎程度”。这个方法有一个有趣的例子 Drupal的放射性模块,其中基于基于用户交互的新近度的活动计算“热度”度量。

要考虑的方法

1)对于MongoDB中的简单视图计数器,我会使用 $inc 在加载页面时增加视图计数。您可以根据需要按角色排除日志记录用户(例如管理员用户)。

2)对于更准确的视图计数器,我会将问题传递给a 网站分析 平台(您应该与您的网站一起使用以进行更详细的分析)。例如,您可以使用 Google AnalyticsAPI 或像开源应用程序 Piwik。 Web分析系统已经有了用于确定唯一用户/视图的解决方案,并且这些API调用可以通过JavaScript异步进行。

3)如果实现自己独特的视图跟踪一个明确的要求,我会使用一个单独的集合来跟踪视图和 UPSERT 根据您的独特性标准(每个独特的视图 user,article 对注册用户或 session_id,article 配对anon用户)。如果upsert导致插入,我会通过递增文章视图的计数器将其与方法#1(为文章视图递增视图计数器)结合起来。


15
2018-03-29 06:17



+1。此线程中的最佳解决方案(如选项3所述)。任何将无界限推入数组的解决方案都会遇到性能和大小限制问题。 - Remon van Vliet
@SalvadorDali:有一个有趣的元讨论 Stack Overflow如何计算问题中的视图数量?。 - Stennie


解决问题的方法之一是使用cookie,一旦用户访问了该页面,您可以添加一个cookie,说明他已经访问过该页面,您无需再次计算他。您可以继续附加一些密钥以了解他访问过的所有页面。我知道可以删除cookie,但在任何解决方案中都会有权衡。

从mongoDB的角度来看,如果你想快速插入和读取,我会建议你做几件事。

1)在创建文章时,在可能的日志集合中创建这样的文档

   {"_id" : "Article URL" , {"Hit" : 0}} 

为什么我不建议添加IP地址或任何其他信息,因为您将添加IP地址,要更改mongoDB的文档的大小需要找到新的分配空间。从性能角度看哪个不好。由于您只是递增计数器,因此不会增加文档的大小,也不需要更改它。 +您可以拥有的文档的最大大小有限制。

2)预先创建文档将提供直接更新声明,并且无需检查文章ID是否存在。


0
2018-03-27 06:44



正如您所提到的,您的解决方案存在一个重要问题 - 任何对互联网如何运作有点熟悉的人都可以将页面浏览量提高到每天几千。他所需要的只是记录刷新+删除cookie。关于第二个提示,谢谢这实际上我是如何一直这样做的 - Salvador Dali