2016-12-28 101 views
0

我的服务正在调用其他服务,并且这个其他服务基于在一分钟内发送的请求的数量来限制我(每秒多少次并不重要,因为只要在最后一刻有< x请求)真正简单的算法来计算最后一分钟的请求数

我想显示一个真的是真的粗略估计我的用户在最后一分钟有多少请求。 无论如何,它并不需要是准确的,它只是一种让用户看到大致数字的方式

实现这种计数器的最佳,最少内存要求的方式是什么?

+0

rpm(包管理器)标签在这里没有关系,请删除 –

+0

你是指在最近60秒内发出的请求数量,或者是当前分钟数,比如14:13,这可能是在10秒前开始的? – assylias

+0

在最近60秒内 – Johny19

回答

1

你可以这样做:

  • 保持int[] requestCount = new int[60]
  • 为每个请求:requestCount[(System.currentTimeMillis()/1000) % 60]++;
  • 运行计划作业每隔1秒钟,重设“陈旧”阵列位置(61秒前)回到0
  • 获得请求的数量在过去60秒时:IntStream.of(requestCount).sum();

注意:

  • 这不会是线程安全的。如果您需要线程安全,则可以使用final AtomicInteger[]阵列。
  • 这不是强大的时钟变化等

的足迹应该是相当小的。

+0

会不会在此处引发问题int [60]和System.currentTimeMillis()%1000不会造成问题?它可以写在位置999,但该阵列只有59 – Johny19

+0

@ Johny19你是对的:应该是'(millis/1000)%60'。 – assylias

+0

“每隔1秒运行一次计划任务以将”陈旧“阵列位置(61秒前)重置为0” 这是否意味着我必须每隔1秒遍历一次数组才能找到超过60秒的条目? – Johny19