如何最好地实施“查看次数”?
Posted
技术标签:
【中文标题】如何最好地实施“查看次数”?【英文标题】:How "View Count" is best implemented? 【发布时间】:2010-10-30 22:44:00 【问题描述】:在任何网站上,例如在 *** 上,每个问题都有一个查看计数,并且用户阅读了一个问题但之前阅读过它不会计算两次。
我对它是如何实现的以及使用哪些表来实现它有一些想法。
你认为最好的实现方式是什么?
【问题讨论】:
【参考方案1】:在我看来,你有几个选择。
Cookies
您可以在用户浏览器中为您记录视图的每个页面存储一个 cookie。检查此 cookie 是否存在,如果 cookie 已存在,则不要记录视图。
这样做的缺点是,如果 cookie 被禁用或有人试图玩弄系统,它将无法工作。
从好的方面来说,您不必担心存储数百万/数十亿行的表数据。
数据库
您为每个视图保存了一个记录。以某种方式将该记录与用户相关联,例如会员ID、IP地址;对用户来说应该是唯一的东西。如果您不要求用户登录,IP 并不理想但足够好。
因此,例如,您将拥有一个包含以下列的表格,
ArticleID(外键) 用户 ID(外键) 日期这个日期很有用,有几个原因,
报告。一旦您知道每个视图的记录时间,您就可以构建更好的统计数据。 查看超时。例如,您可能只想为每个用户每小时存储一个视图。保留日期列后,您可以执行此操作。如果您的应用程序在这种情况下变得流行,那么您将需要处理存储问题。我运行一个流行的 Facebook 应用程序,该应用程序导致每天添加超过 100,000 个视图行。实际上,如果您的应用程序变得如此受欢迎以至于成为问题,那么您将面临更大的问题需要处理。
【讨论】:
【参考方案2】:在我的网站上,我通过使用随机数除以浏览次数来处理访客浏览次数以及由此产生的“数据量”。
假设我有一个在 0 和 1 之间分布良好的随机数生成器,并且我每天在特定页面上获得 100,000 次浏览。如果我在每个视图中调用 'logView()' 函数,但在其中生成一个新的随机数,并且仅当随机数
如果我想返回一个视图计数,那么我只需将我的 DB 编号除以相同的值,例如。 1000/0.001 = 100,000。这大约精确到最近的 1000 个视图。
显然,您可以根据网站的负载选择一个随机数范围,如果您的负载发生巨大变化,甚至可以更改此范围(您只需相应地修改您存储的值)。
此外,只有 1000 次浏览的页面甚至可能不会在浏览次数中获得 1,但如果您有一个浏览次数为 100,000 的页面,那么浏览次数为 1000 的页面就微不足道了。
【讨论】:
好主意。感谢分享 保存每个页面的数据库命中的替代方法可以将其存储在 Redis 内存缓存中。如果页面性能是将计数保存到数据库的唯一问题,那么它可以异步完成。【参考方案3】:简短回答:视情况而定!
这实际上取决于您对观看次数的要求有多准确,一个人可能被注册两次或三次是否可以接受? 这取决于您要将数据用于什么用途。如果您想对数据做其他整洁的事情(统计信息、最近的视图列表等),您可能需要考虑将所有单独的视图存储在数据库中。这可能会导致一个巨大的表,因此您必须在实现它之前解决这个问题。我之前使用 cookie 与内存数据库相结合来存储个人视图(出于显而易见的原因,我将实际视图计数存储在持久保存到磁盘的数据库表中)。我可以这样做,因为统计数据没有任何意义。
【讨论】:
【参考方案4】:看起来 *** 不计算查看主题的访客(未登录)用户。计算匿名用户浏览量的问题是您的计数器可能会被玩弄。有人可以随时删除 cookie 并再次查看。记录视图是确保准确性的最安全的解决方案,但当然您有两个主要问题:表的大小和缺少来宾/匿名用户。令我惊讶的是,*** 没有记录来宾(未登录)用户。我认为大部分视图将来自这些用户进行谷歌搜索。
【讨论】:
【参考方案5】:当您网站的大多数访问者都已注册时,相对容易确保没有一个访问者被计算两次。
我不确定 SO 是否会计算客人的观看次数。我想我可以检查一下,但已经晚了。
【讨论】:
我只是多次查看一个问题,第一次之后计数没有变化。 我认为它也不计算 OP 的观看次数 - 所以如果我问一个问题然后查看观看次数,我认为这是查看过问题。【参考方案6】:我会尝试从功能的角度给出答案。
计算每位用户的观看次数 - 针对注册用户。对于匿名用户 - 每个会话。
增加第一个视图的视图计数以及查看该项目的人以外的其他人进行重大更新后的任何视图。
创作时的海报浏览量不应计入
你也可以想象做起来更简单,但我试图想出一个理想的解决方案。
【讨论】:
以上是关于如何最好地实施“查看次数”?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Rails 中显示查看次数(例如此链接/页面已查看 68 次)?