我想写一个点击计数器脚本来跟踪网站上的图像和原始IP的点击。每天的展示次数高达数十万,因此计数器每秒会增加很多次。
我正在寻找一种简单的自托管方法(php,python脚本等)。我正在考虑使用MySQL来跟踪这一点,但我猜这是一种更有效的方法。什么是保持柜台的好方法?
答案 0 :(得分:7)
一个引人入胜的主题。增加一个简单的计数器,只是有成为一个事务......这意味着,它可以锁定整个数据库的时间超过有意义! - )它很容易成为瓶颈整个系统。
如果您需要严格准确的计数但不需要它们立即更新,我最喜欢的方法是将可数信息附加到日志中(根据数据新鲜度的需要经常切换日志)。一旦日志关闭(其中包含数千个可数事件),脚本就可以读取它并更新单个事务中所需的所有事件 - 可能不直观,但比数千个单锁更快。
然后有非常快的计数器,只有统计准确 - 但由于你没有说这种不精确是可以接受的,我不打算更深入地解释它们。
答案 1 :(得分:4)
你可以带你的网络服务器的访问日志(Apache:access.log)并一次又一次地评估它(cronjob),以防你不需要手头的数据。有人访问您网站的时间。
通常,无论如何都会生成access.log,其中包含所请求的资源以及时间,日期和用户的IP。这样您就不必通过php脚本路由所有流量。精益,意味着计数机。
答案 2 :(得分:2)
有两种非常简单的方法:
选项1适用于现成的工具。选项2只需要一些编程,但可以为您提供更接近实时更新的功能,而不会在流量激增时(例如您在直接mysql情况下找到的那样)导致崩溃。
答案 3 :(得分:2)
将每个计数器存储到自己的密钥中。然后简单地
INCR key
答案 4 :(得分:1)
如果准确性很重要,你可以用MySql稍微慢一点......创建一个HEAP / Memory表来存储你的计数器值。这些内存表非常快。您可以每隔一段时间将数据写入普通表。
根据应用引擎的想法,您可以使用memcache作为计数器的临时存储。增加memcache计数器比使用MySql堆表更快(我认为)。每隔五或十秒钟,您就可以读取内存缓存计数器并将该数字写入数据库。
答案 5 :(得分:0)
不确定它是不是你的小巷,但是AppEngine是一个非常好的平台。您可以使用一些示例代码来使用他们的DataStore和事务来构建计数器:http://code.google.com/appengine/docs/python/datastore/transactions.html。
答案 6 :(得分:0)
您可以使用Redis - 它是非常快速的键值存储,支持原子增量。如果需要,可以轻松地在多个服务器之间分割数据。
答案 7 :(得分:0)
我做了类似的事情,类似的规模(多个服务器,数百个域,每小时数千次点击),日志文件分析绝对是可行的方法。 (它还检查了命中率,按文件类型加权,并在防火墙上列出黑名单的IP地址,如果它们提出了太多请求;它的目的是自动阻止坏机器人,而不仅仅是一个计数器,但计数是一个必不可少的一部分。)
对Web服务器进程本身没有性能影响,因为它没有在那里做任何额外的工作,并且您可以通过每分钟/ 5分钟/ 100次点击/无论如何将它们注入站点的数据库中来轻松发布定期更新的命中计数。必须在每次点击时锁定相关的行/表/数据库(取决于使用的锁定机制)。
答案 8 :(得分:-1)
好吧,如果您碰巧使用PHP路由,您可以使用SQLite数据库,但MySQL是一种非常合理的方式来存储该信息,并且通常(至少从我见过的那些)是如何的完了。
如果你不想在一个简单的数字中存储IP地址和任何其他信息 文本文件可以工作。