滑动窗口的java实现-循环数组

一、用循环数组实现滑动窗口

1.1、实现思想


1.定义一个AtomicInteger array数组,每一个元素记录当前区间的计数

2.定义一个long数组 times,记录对应array下标元素开始的时间.

3.定义一个下标int index 记录当前正在使用的位置.

4.定义每个元素的时间区间大小span = 200 ms


index变化情况如下:

1、如果当前时间now - times[index]>span 说明当前请求计数应当位于下一个位置的元素.

index++,

如果index>=size(当前数组大小),则index=0;

2、如果now-times[index]大于传入的计数时间 如1s,则说明,该时间元素无效,重置:

   times[index]=now;

  array[index].set(0);

1.2、计数逻辑

1.加锁控制

2.按照上面index逻辑更新index,和对应array和times数组里面的元素信息

1.3、获取当前1s内数量

如果get方法加锁,则会影响滑动窗口性能,所以该方法不加锁,得到的值是一个近似精确的值.

实现逻辑:

1.获取到当前下标curIndex

2.设定循环次数: time = seconds(滑动窗口统计时间) * 1000 /span

3、开始循环,递减curIndex累加当前array对应的值,

判断条件

1.当前index 对应的times[index] 符合now-times[index]

2、不超过time次循环


二、代码实现

链接:

数组实现

你可能感兴趣的:(滑动窗口的java实现-循环数组)