Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 关于Youtube浏览量统计_Database_Ruby On Rails 3_Database Performance - Fatal编程技术网

Database 关于Youtube浏览量统计

Database 关于Youtube浏览量统计,database,ruby-on-rails-3,database-performance,Database,Ruby On Rails 3,Database Performance,我正在实现一个应用程序,它可以跟踪一篇文章的浏览次数。但我想用一种“聪明”的方式来跟踪。这意味着,我不想仅仅因为用户刷新浏览器就增加视图计数器 因此,我决定只在IP和用户代理(浏览器)是唯一的情况下增加视图计数器。到目前为止,这是有效的 但后来我想。如果Youtube是这样做的,他们有几个视频,有数千甚至数百万的浏览量。这意味着他们在数据库中的视图表将被IP和用户代理过度填充 这让我想到他们的视频表有一个视图计数器缓存(即视图\u计数)。这意味着,当用户单击视频时,将存储IP和用户代理。另外,视

我正在实现一个应用程序,它可以跟踪一篇文章的浏览次数。但我想用一种“聪明”的方式来跟踪。这意味着,我不想仅仅因为用户刷新浏览器就增加视图计数器

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

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

这让我想到他们的视频表有一个视图计数器缓存(即
视图\u计数
)。这意味着,当用户单击视频时,将存储IP和用户代理。另外,视频表中的计数器缓存列增加

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


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

如果您想存储所有的IP和浏览器,那么请确保您有足够的DB存储空间,添加一个索引即可。
如果没有,那么您可以使用rails会话来存储用户访问过的视频列表,并且当用户访问新视频时,只增加视频的view\u count属性。

首先,好吧,youtube使用BigTable,所以不用担心查询计数,反正我们不知道数据库的确切结构

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

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


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

我会利用客户端浏览器指纹识别来唯一地识别浏览次数。这个图书馆似乎正在获得巨大的吸引力:

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

这是您希望用于增加计数器的命令:

本例中的密钥是从客户端发送给您的浏览器指纹哈希。然后,您可以拥有一个Redis“集合”,其中包含已知与给定用户id关联的所有浏览器指纹的列表(集合的键将是用户id)

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


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

使用后者。这不会达到每个用户可以存储多少会话的内存限制吗?想象一下,一个用户观看数千或更多的视频,我不会为此担心。您将存储整数(视频ID)的散列,最坏情况下为8字节。1000*8=~8KB,这在我看来没什么:)此外,用户在同一个会话中观看1000多个视频并不太常见。因此,您建议,如果我在db的一个表中保留所有访问的记录,应该不会有问题吧?即使我有数百万行?我建议不要保留所有记录,而是定期聚合和删除它们。因此基本上在后台有某种cron作业来删除任何超过24小时的视图记录?没错。您也可以使用mysql支持的memcached,因为memcached中的增加操作是原子操作,而失去一两次访问通常并不重要。但我如何防止机器人、爬虫等随机增加计数?