如何"查看计数"最佳实施?

nop*_*ole 22 schema database-design

在任何网站上,例如在StackOverflow上,每个问题都有一个视图计数,用户阅读一个问题但之前已经读过它不会计数两次.

我对如何实现它以及使用哪些表来实现它有一些想法.

您认为实施此方法的最佳方式是什么?

Cra*_*vis 11

我看到你有几个选择.

饼干

您可以在用户浏览器中为要记录视图的每个页面存储cookie.检查此cookie是否存在,如果cookie已存在,则不记录视图.

缺点是,如果禁用cookie或有人试图游戏系统,它将无法工作.

从好的方面来说,您不必担心存储可能数百万/数十亿行的表数据.

数据库

您为每个视图保留一条记录.以某种方式将该记录与用户相关联,例如MemberID,IP Address; 对用户来说应该是唯一的东西.如果您不要求用户登录,IP并不理想,但足够好.

所以你会有一个包含以下列的表,

  • ArticleID(外键)
  • 用户ID(外键)
  • 日期

由于几个原因,日期将有用,

  • 报告.一旦知道记录每个视图的时间,就可以构建更好的统计数据.
  • 查看超时.例如,您可能只想每个用户每小时存储一个视图.保持日期列,您可以执行此操作.

如果您的应用程序在这种情况下变得流行,那么您将需要处理存储问题.我运行一个流行的Facebook应用程序,每天会添加超过100,000个视图行.实际上,如果你的应用程序如此受欢迎,以至于它成为一个问题,那么你将面临更大的问题需要处理.


Ner*_*cer 11

在我的网站上,我通过使用随机数划分视图数来处理客户视图和"大量数据".

假设我有一个0到1之间分布良好的随机数生成器,我每天在特定页面上获得100,000个视图.如果我在每个视图中调用'logView()'函数,但在其中生成一个新的随机数,并且当随机数<0.001时才真正将视图记录到数据库中,那么对于100,000个视图,我只会大约点击DB 100,000*0.001 = 1000次.

如果我想返回一个视图计数,那么我只需将我的DB编号除以相同的值,例如.1000/0.001 = 100,000.这近似精确到最近的1000个视图.

显然,您可以根据站点的负载选择随机数范围,如果负载发生显着变化,甚至可以更改此值(您只需相应地修改存储的值).

此外,只有1000个视图的页面在视图计数中甚至可能得不到1,但如果您有一个包含100,000个视图的页面,则1000的视图非常无关紧要.

  • 保存每个页面的 db 命中的替代方法是将其存储在 Redis 内存缓存中。如果页面性能是将计数保存到 db 的唯一问题,那么它可以异步完成。 (2认同)

Kim*_*ble 5

简短的回答:这取决于!

  • 这真的取决于您需要的观看次数有多准确,一个人可能被注册两次或三次是否可以接受?
  • 这取决于你要使用数据做什么。如果您想对数据(统计信息、最近的视图列表等)做其他整洁的事情,您可能需要考虑将所有单独的视图存储在数据库中。这可能会导致一个巨大的表格,因此您必须在实施之前解决这个问题。

我以前使用 cookie 结合内存数据库来存储个人视图(出于显而易见的原因,我将实际视图计数存储在持久化到磁盘的数据库表中)。我可以这样做,因为统计数据没有任何意义。