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

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

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

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

现在我正在考虑一个解决方案 Redis服务器, ,但我还没有任何解决方案。

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

有帮助吗?

解决方案

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

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

有一个 MySQL 触发器,您可以使其仅在整批插入完成后运行,您可以使用它来更新报告表,这样您就不必不断地点击主命中跟踪表。

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

其他提示

你可以做的是店走访什么以及在什么日期(时间戳),你会为一些被访问每一次做到这一点。当你想获取什么visitied,你会选择一个日期范围(时间戳)内的那些,并添加在一起。

OR

每个链接都会有自己相应的行为每次被访问的日子。如果他们不止一次在一天内参观了则反而会加重+1到已经存在的价值。

您可以使用第二个例子,做每周的存储,而不是每天,如果你的几周都像周日到周六和今天不前7天。因此,与因此具有较少量的数据存储的字周替换词语一天。

我看到你想避免庞大的数据存储,但到你想要的程度上,这工作我没有看到明显优于this.You可以使用第二个例子,做每周的存储,而不是每天,如果你的是周今天像星期日至星期六,而不是前7天。

下面是寻找一些文档后吉斯服务器的可能性。

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

希望这有助于你。

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

有将是一个“PAGEID”列中,“日”栏,和“视图”列。所述PAGEID将对应于页面正被观看,并且“日”将对应于它是在观察到的一天。

在用户浏览网页每一次,它找到(或创建如果有尚未一个),其与它的PAGEID的ViewCounters表中的行,和与所述当前日期。然后,它将递增“视图”列中该行。

此为您提供了关于创建新的计数器和访问历史最大的灵活性。此外,每月,每周和每日柜台观看次数都非常便宜生成。

另外一个很大的好处,这将是它唯一的每页行每天,这是不是真的那么坏。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top