代码之家  ›  专栏  ›  技术社区  ›  Salvador Dali

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

  •  17
  • Salvador Dali  · 技术社区  · 11 年前

    因此,基本上我想实现与StackOverflow相同的功能:

    viewed 59344 times
    

    以下是一些背景信息:

    1. 我只想计算唯一的访问次数。注册用户会多次阅读这篇文章的假设(它正在发展)
    2. 我使用MongoDB作为存储
    3. 我希望它接近实时
    4. 我的系统将进行注册,但我也想统计匿名用户的浏览量

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

    Mongo的使用并不是绝对必要的,只是现在一切都是用Mongo编写的,所以只有在速度更快/方便的情况下,我才会切换。

    2 回复  |  直到 3 年前
        1
  •  27
  •   Stennie    11 年前

    出身背景

    你是吗 某些 你需要跟踪“独特”的视图吗?

    事实上,我不希望受欢迎的网站试图保持浏览量的唯一性——越大越好,重新访问新评论仍然是显示新内容/评论/广告的额外“浏览量”。“正确性”还有其他可能的微妙之处,对您的用例来说可能很重要,也可能不重要,例如排除爬虫或您自己公司的用户/IP。

    与其花时间跟踪独特的浏览量(这没有太大意义),我会考虑计算独特的用户互动,比如在页面上投票/点赞/评论。然后,您可以根据这些指标使用一些公式来确定页面的“受欢迎程度”。在 Radioactivity module for Drupal ,其中“热度”度量是基于基于用户交互的最近度的活动来计算的。

    考虑的方法

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

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

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

        2
  •  0
  •   Devesh    11 年前

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

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

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

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

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

    2) 提前创建文档将提供直接的更新语句,无需担心是否存在文章Id的文档。