每日,每周和每月页面查看计数器

时间:2010-04-08 16:22:30

标签: ruby-on-rails count counter redis

我正在构建一个包含用户生成内容的网站。在主页上,我想显示所有已创建项目的列表,我希望能够通过视图计数器对它们进行排序。这听起来很简单,但我想要多个计数器。我想知道最后一天,上周或上个月或整体中访问次数最多的项目。

我的第一个想法是在项目的DB-Table中创建4个计数器列。每天,每周,每月和整体各一个,并创建一个cron作业,每24小时清除一次每日计数器,每7天清除一次计数器,等等。

但我的问题是,如果我想知道哪一周是本周观看次数最多的项目,就在每周计数器被清除后会发生什么?

我需要的是一种创建连续计数器的有效方法,该计数器针对每个太旧的页面视图进行了缩减,并且针对每个新的页面视图进行了增加。

现在我正在考虑使用redis server的解决方案,但我还没有任何解决方案。

我只是想在这里寻找一个大致的想法,但是我在Ruby on Rails中开发这个应用程序。

3 个答案:

答案 0 :(得分:3)

我建议跟踪每个页面上的点击数,只有一个时间戳和任何用户ID或者你可以存储什么,然后你可以计算你喜欢的计数器并在以后更改它,因为你有一个简单的数据使用格式。具有实体(页面)用户标识和时间戳的表应该是好的。只需在请求页面时添加即可。

要减少插入数量,您可以在软件中将它们一起批处理。为MySQL构建像here这样的多行插入将节省开销。您将只需要您的类来按照描述构造插入并存储直到插入。一个想法是不仅要对它进行计时,而是将批量行固定到批处理中,这样您最多可以说服务器是否只会丢失x行的命中数。

只有在完成完整批量的插入后才能运行MySQL触发器,您可以使用它来更新报告表,这样您就不必经常点击主命中跟踪表。

此外,如果确实需要真正的高吞吐量,它可以分解为自己的分片,并通过Ajax调用进行访问以进行命中跟踪并获得计数。

答案 1 :(得分:1)

您可以做的是存储访问的内容以及日期(时间戳),并且每次访问某些内容时都会执行此操作。当你想要检索被访问者时,你会选择日期范围内的那些(时间戳)并将它们加在一起。

OR

每个链接在访问的每一天都有各自的行。如果他们在一天内被访问过多次,那么它将为现有值添加+1。

你可以使用第二个例子,而不是每天进行每周存储,如果你的周数是星期日 - 星期六而不是今天的7天。因此,将单词day替换为单词week,因此数据存储量较小。

我看到你想要避免大量的数据存储,但是在你希望这个工作的程度上我看起来并不比这更好。你可以使用第二个例子并且每周存储而不是每天存储如果你的周数是星期六和星期六之间的事情,而不是今天的前7天。

在查看一些文档之后,这是regis服务器的可能性。

SET link_id|date => "visit_count"

这会存储link_id或您调用的任何内容以及date分隔的|或您想要使用的任何字符。在该键值中,您可以存储visit_count

假设您要在此日期为该链接添加匹配。您可以GET link_id|date然后将+1添加到它返回的visit_count,然后按照我上面显示的方式将其存储回来。

如果您想获得特定日期的点击量,那么您可以再次使用GET link_id|date

您只需使用ruby-on-rails将link_iddatevisit_count替换为适当的值。

希望这可以帮助你。

答案 2 :(得分:0)

你可以做的是创建一个名为ViewCounters的表。

会有'pageId'列,'day'列和'views'列。 pageId对应于正在查看的页面,“day”将对应于查看的日期。

每次查看页面时,它都会在ViewCounters表中找到(或创建,如果还没有)该行的pageId,以及当前日期。然后它会增加该行的“视图”列。

这为您提供了创建新计数器和访问历史记录方面的最大灵活性。此外,每月,每周和每日计数器的查看计数都非常便宜。

另一个很大的好处就是它每天每页只有一行,这并不是那么糟糕。