代码之家  ›  专栏  ›  技术社区  ›  zzzeek

在不记录每次点击的情况下,估算每小时URL点击次数的巧妙方法?

  •  3
  • zzzeek  · 技术社区  · 16 年前

    我不想清楚地记录每次点击的原因是,这样数据库就不会因为每小时数千条额外的INSERT语句(以及一个多小时前的相应数据删除)而不堪重负,或者我不必启动额外的存储系统(tokyo-stroptor、grepping apache日志等)来记录这些点击。

    6 回复  |  直到 16 年前
        1
  •  4
  •   Gunnlaugur Briem    16 年前

    last_counter_reset_time 在DB?

    Memcached有一个轻量级的原子 incr .

    我不是memcached的老手,但我想有办法相当确定所有URL的计数器都保持缓存。没有持久性,因此您可能随时丢失计数器,但偶尔丢失这种数据可能是可以接受的。

        2
  •  3
  •   Juparave    16 年前

    你有没有尝试过另一种方法,比如外部统计服务?也许谷歌分析?它可以在不增加服务器负载的情况下为您提供所需的信息。

        3
  •  1
  •   Callie J    16 年前

    您是否有理由忽略对apache访问日志的处理?它们确实有时间戳的好处,并且由服务器自动创建,而且相当轻便。一个相当简单的perl或awk脚本可以保存日志的运行摘要,以便进行简单的解析。

        4
  •  0
  •   Jay    16 年前

    首先,为什么要保留时间戳?您可以通过在数据库中为每个URL保留一条记录,并在每次单击时递增计数来保持精确计数。

    实际上,您可能一次可以计算多个URL,而不会给服务器带来过重的负担,因此您可以选择一些方便的URL数量,十个或一百个,或者您的系统可以处理的任何数量。

        5
  •  0
  •   Jouni K. Seppänen    16 年前

    这可能不是一个实用的解决方案,但既然你要求一种“聪明”的方法, here

        6
  •  0
  •   Jason Watkins    16 年前

    如果你想要精确的计数,Redis是完成这项任务的理想选择。它的速度与memcached大致相当,但提供了持久性。持久性基于按顺序分叉和写入磁盘,因此避免了在数据库中保存此类信息的高io负载。

    如果你想要一个非常简单的方法:以无偏见的方式丢弃样本,(即 log_request(foo) if rand(1) < 0.1 对10%的流量进行采样)。如果你访问的URL上的任何信号都小于你进行二次采样的比率,那么你会丢失这些信号,但如果你对访问量大的URL最感兴趣,这可能非常简单高效。

    上面的方案有更复杂的变体,你用一个随着计数增长而吸取教训的概率来更新计数器(然后在读取计数器时通过概率函数对其进行适当的加权),这是一种卑鄙的重要性抽样形式。这些几乎同样简单,并且更好地保留了分布尾部的计数。

    • 编辑:

    啊,对不起,我现在从评论中看到,你在一段时间内都在关注房价。我使用的方法与采样/计数器基本相同,只需将单个计数器存储一段时间(即每小时)。为了保存长期档案,需要为批处理作业从细粒度(每小时)表填充的较大时间段(每天、每周)提供额外的汇总表,以便从细粒度表中删除旧数据。

    RRDTool是这一思想的一个更通用的实现,几个OSS监控解决方案都使用它。

    推荐文章