在网上搜滑动时间窗口限流算法,大多都太复杂了,本人实现了个简单的,原理稍后再补充,先上代码
public static void main(String[] args) throws InterruptedException { List<Long> list = new ArrayList<>(); while (true) { System.out.println(new Date().toString() + isGo(list, 2, 1000 * 10)); Thread.sleep(1000 * new Random().nextInt(10)); } } /** * 滑动时间窗口限流算法 * 在指定时间窗口,指定限制次数内,是否允许通过 * * @param list 队列 * @param count 限制次数 * @param timeWindow 时间窗大小 * @return 是否允许通过 */ public static boolean isGo(List<Long> list, int count, long timeWindow) { long nowTime = System.currentTimeMillis(); if (list.size() < count) { list.add(0, nowTime); return true; } Long farTime = list.get(count - 1); if (nowTime - farTime > timeWindow) { list.remove(count - 1); list.add(0, nowTime); return true; } else { return false; } }