14

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

viewed 59344 times

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

  1. 我只想计算唯一访问次数。注册用户会多次阅读文章的假设(正在演变)
  2. 我使用 MongoDB 作为商店
  3. 我希望它接近实时
  4. 我的系统会有注册,但我也想统计匿名用户的浏览量

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

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

4

2 回答 2

23

背景

确定需要跟踪“独特”视图吗?

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

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

考虑的方法

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

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

3)如果实现您自己的唯一视图跟踪明确的要求,我将使用单独的集合来跟踪视图并根据您的唯一性标准(注册用户的每对唯一视图或匿名用户的配对)进行更新插入。如果 upsert 导致插入,我会将其与方法 #1(增加文章视图的视图计数器)相结合,方法是增加文章视图的计数器。user,articlesession_id,article

于 2013-03-29T06:17:19.560 回答
0

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

从 mongoDB 的角度来看,如果您想要非常快速的插入和读取,我建议您可以做几件事。

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

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

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

2)提前创建文档将给出直接更新声明,无需担心文章ID的文档是否存在。

于 2013-03-27T06:44:32.030 回答