Java 计算最后一分钟请求数的Real simple算法
我的服务正在调用另一个服务,而该另一个服务根据在一个洞分钟内发送的请求数限制我(不管每秒发送多少请求,只要最后一分钟内有Java 计算最后一分钟请求数的Real simple算法,java,count,request,Java,Count,Request,我的服务正在调用另一个服务,而该另一个服务根据在一个洞分钟内发送的请求数限制我(不管每秒发送多少请求,只要最后一分钟内有
实现这样一个计数器,最好的、占用内存最少的方法是什么?您可以这样做:
- 维护一个
int[]requestCount=new int[60]
- 对于每个请求:
requestCount[(System.currentTimeMillis()/1000)%60]+代码>
- 每1秒运行一次计划作业,将“过时”阵列位置(61秒前)重置回0
- 要获取过去60秒内的请求数:
IntStream.of(requestCount.sum()代码>
- 这不是线程安全的。如果需要线程安全,可以使用
数组final AtomicInteger[]
- 这对时钟变化等不稳定
占地面积应该相当小。您可以执行以下操作:
- 维护一个
int[]requestCount=new int[60]
- 对于每个请求:
requestCount[(System.currentTimeMillis()/1000)%60]+代码>
- 每1秒运行一次计划作业,将“过时”阵列位置(61秒前)重置回0
- 要获取过去60秒内的请求数:
IntStream.of(requestCount.sum()代码>
- 这不是线程安全的。如果需要线程安全,可以使用
数组final AtomicInteger[]
- 这对时钟变化等不稳定
占用空间应该相当小。rpm(软件包管理器)标记在此处不相关,请删除。您是指在过去60秒内或在当前分钟内(如14:13)发送的请求数,这可能是10秒前开始的?在过去60秒内,SRPM(软件包管理器)标记在此处不相关,请问您的意思是在过去60秒内发送的请求数,或者在当前分钟内发送的请求数,比如说14:13,这可能是10秒前开始的?在过去60秒内,新的int[60]和System.currentTimeMillis()%1000不会在这里引起问题吗?它可以在999位置写入,但数组只能在59@Johny19你说得对:应该是
(毫秒/1000)%60
“每1秒运行一个计划作业,将“过时”数组位置(61秒前)重置回0”这是否意味着我必须每1秒遍历一次数组,以发现with条目超过60秒?我怀疑类似requestCount[(millis/1000)%60+1]=0的东西可能会起作用-待测试。取决于你想要的精确程度。可能会再次如此(索引60)。但是,是的,我明白你的意思,我现在就试试。新的int[60]和System.currentTimeMillis()%1000不会在这里引起问题吗?它可以在999位置写入,但数组只能在59@Johny19你说得对:应该是(毫秒/1000)%60
“每1秒运行一个计划作业,将“过时”数组位置(61秒前)重置回0”这是否意味着我必须每1秒遍历一次数组,以发现with条目超过60秒?我怀疑类似requestCount[(millis/1000)%60+1]=0的东西可能会起作用-待测试。取决于你想要的精确程度。可能会再次如此(索引60)。但我明白你的意思,我现在就试试