6

我正在实现一个应用程序来跟踪查看帖子的次数。但我想保持一种“智能”的跟踪方式。这意味着,我不想仅仅因为用户刷新他的浏览器而增加查看计数器。

所以我决定只在 IP 和用户代理(浏览器)是唯一的情况下增加查看计数器。到目前为止,这是有效的。

但后来我想。如果 Youtube 是这样做的,他们有几个视频有数千甚至数百万的观看次数。这意味着他们在数据库中的视图表将被过度填充 IP 和用户代理......

这让我假设他们的视频表有一个用于视图的计数器缓存(即views_count)。这意味着,当用户点击视频时,会存储 IP 和用户代理。另外,增加了视频表中的计数器缓存列。

每次点击视频。Youtube 需要查询视图表并计算条目数。这不会严重影响性能吗?

他们是这样做的吗?或者,还有更好的方法?

4

3 回答 3

2

我会利用客户端浏览器指纹来唯一地识别视图计数。这个库似乎受到了很大的关注:

https://github.com/Valve/fingerprintJS

我还建议将 Redis 用于与计数有关的任何事情。它的原子增量命令易于使用,并保证您的计数永远不会因竞争条件而混乱。

这将是您要用于递增计数器的命令:

http://redis.io/commands/incr

在这种情况下,关键是从客户端发送给您的浏览器指纹哈希。然后,您可以拥有一个 Redis “集合”,其中包含已知与给定 user_id 关联的所有浏览器指纹的列表(该集合的键是 user_id)。

最后,如果您确实需要,您可以运行 cron 作业或其他异步进程,将每个用户的视图计数转储到关系数据库的计数器缓存字段中。

您还可以采用将 user_id、浏览器指纹和时间戳存储在关系数据库(mysql?)中的方法,并定期将它们缓存到您的用户表中(可能通过 cron)。

于 2013-09-05T09:04:00.073 回答
1

如果你想存储所有的 IP 和浏览器,那么确保你有足够的数据库存储空间,添加一个索引就可以了。如果没有,那么您可以使用 rails 会话来存储用户访问过的视频列表,并且仅在他访问新视频时增加视频的 view_count 属性。

于 2011-09-28T19:46:15.327 回答
1

首先,afaik,youtube使用BigTable,所以不用担心查询count,反正我们也不知道数据库的具体结构。

假设您在关系模型上,请创建一个列 view_count,但不要在每次刷新时更新它。记录访问并定期更新缓存。

此外,您可以从 IP、浏览器、日期和您用来检测这是否是唯一视图的任何其他信息生成哈希,并且不存储整个数据。

此外,您可以使用 session/cookie 来记录正在查看的视图。由于它会过期,所以不会出现这样的内存问题 - 我不相信有人会在一个会话中观看数千个视频

于 2011-09-28T20:02:36.417 回答