【发布时间】:2018-01-24 07:23:27
【问题描述】:
我需要知道不同事件发生的频率。例如,过去 15 分钟内发生了多少 HTTP 请求。因为可能有大量事件(数百万),所以必须使用有限的内存量。
Java 中是否有任何 util 类可以做到这一点?
如何在 Java 中实现这个 self?
理论使用代码如下:
FrequencyCounter counter = new FrequencyCounter( 15, TimeUnit.Minutes );
...
counter.add();
...
int count = counter.getCount();
编辑:它必须是一个实时值,每分钟可以更改数千次,并且每分钟会查询数千次。基于数据库或文件的解决方案是不可能的。
【问题讨论】:
-
您还有其他限制吗? (并发方面?)
-
如果您的应用程序输出了一些日志并且我确定确实如此,为什么您没有另一个进程(实际上可以位于另一台服务器上,只要它可以访问日志文件)分析这些日志以提取此信息?如果您不需要实时获取此信息,您可以想象触发一种批处理作业,该作业每天执行一次计算,或者在负载不高时(例如在夜间)每天执行几次等)
-
您可以有一个在午夜重置的计数器,并在数据库中输入每分钟的请求数。然后,您需要计算的只是间隔开始和结束时分钟的分数,其余的可以计算出来。这也可以通过每 x 秒存储一次计数来进一步优化,您可以用分钟和更小的间隔计算计数,因此您只需计算 x 秒。
-
@Allan 它必须是实时的。抱歉忘记写了。
-
@GalAbra 是的,需要并发/线程安全。但我认为同步应该解决这个问题。一定不能高并发。
标签: java algorithm counter performancecounter