2

我正在建立一个包含用户生成内容的网站。在主页上,我想显示所有已创建项目的列表,并且我希望能够按查看计数器对它们进行排序。这听起来很简单,但我想要多个计数器。我想知道最后一天、上周或上个月或总体上访问量最大的项目。

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

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

我需要的是一种有效的方法来创建一个连续的计数器,对于每个太旧的页面视图都会减少,而对于每个新的页面视图都会增加。

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

我只是在这里寻找一个总体思路,但仅供参考,我正在用 Ruby on Rails 开发这个应用程序。

4

3 回答 3

3

我建议使用时间戳和任何用户 ID 或您可以存储的任何内容来跟踪每个页面上的点击,然后您可以计算您喜欢的计数器并在以后更改它,因为您拥有易于使用的数据格式. 具有实体(页面)用户 ID 和时间戳的表应该是好的。只需在请求页面时添加即可。

要减少插入的数量,您可以在软件中将它们一起批处理。像这里一样为 MySQL构建多行插入将节省开销。您只需要您的类来构建所描述的插入并存储直到插入。一个想法是不仅要计时,还要修复一些要批处理的行,这样您最多可以说如果服务器停止运行,您是否只会丢失 x 行命中。

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

此外,如果这确实需要非常高的吞吐量,则可以将其分解为自己的分片并通过 Ajax 调用访问以进行命中跟踪并获取计数。

于 2010-04-08T16:33:25.160 回答
1

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

或者

您的每个链接在访问的每一天都有各自的行。如果他们在一天内被访问不止一次,那么它将为已经存在的值添加 +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_id,datevisit_count使用适当的值。

希望这可以帮助你。

于 2010-04-08T16:36:05.130 回答
0

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

将有一个“pageId”列、一个“day”列和一个“views”列。pageId 将对应于正在查看的页面,而“day”将对应于它被查看的日期。

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

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

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

于 2010-04-08T16:46:47.200 回答