Java實現滑動時間視窗限流
阿新 • • 發佈:2021-10-19
package demo; import java.time.LocalDateTime; import java.util.LinkedList; import java.util.Random; /** * @author weylan */ public class SlideWindow { static LinkedList<long> timeWindow = new LinkedList<>(); /** * 滑動時間視窗限流演算法 * 在指定時間視窗,指定限制次數內,是否允許通過 * * @param windowSize 時間視窗大小,單位 秒 * @param count 允許通過的次數 * @return 是否允許通過 */ public static boolean process(long windowSize, int count) { long nowTime = System.currentTimeMillis(); // 未達到限制次數,則允許通過,並添加當前時間戳到佇列開始位置 if (timeWindow.size() < count) { timeWindow.addFirst(nowTime); return Boolean.TRUE; } // 佇列已滿(達到限制次數),則獲取佇列中最早(隊尾)新增的時間戳 Long farTime = timeWindow.getLast(); // 用當前時間戳 減去 最早新增的時間戳 if (nowTime - farTime <= windowSize) { // 若結果小於等於windowSize,則說明在windowSize內,通過的次數大於count return false; } // 若結果大於windowSize,則說明在windowSize內,通過的次數小於等於count // 允許通過,並刪除最早新增的時間戳,將當前時間新增到隊首 timeWindow.removeLast(); timeWindow.addFirst(nowTime); return Boolean.TRUE; } public static void main(String[] args) throws InterruptedException { Random random = new Random(); while (true) { // 10秒只允許2次通過 System.out.println(LocalDateTime.now() + " : " + process(10000, 2)); // 睡眠 0~10秒 Thread.sleep(1000L * random.nextInt(10)); } } }
結果:
2021-10-19T16:30:56.654 : true 2021-10-19T16:30:56.655 : true 2021-10-19T16:31:03.659 : false 2021-10-19T16:31:09.663 : true 2021-10-19T16:31:12.663 : true 2021-10-19T16:31:20.667 : true 2021-10-19T16:31:21.671 : false 2021-10-19T16:31:21.671 : false 2021-10-19T16:31:26.675 : true 2021-10-19T16:31:27.679 : false 2021-10-19T16:31:29.680 : false 2021-10-19T16:31:38.682 : true 2021-10-19T16:31:47.686 : true 2021-10-19T16:31:56.690 : true 2021-10-19T16:31:58.695 : true 2021-10-19T16:32:04.696 : false 2021-10-19T16:32:11.698 : true 2021-10-19T16:32:11.698 : true 2021-10-19T16:32:11.698 : false 2021-10-19T16:32:15.702 : false 2021-10-19T16:32:21.705 : true 2021-10-19T16:32:23.709 : true 2021-10-19T16:32:32.708 : true 2021-10-19T16:32:40.711 : true 2021-10-19T16:32:45.715 : true 2021-10-19T16:32:50.719 : true 2021-10-19T16:32:57.720 : true 2021-10-19T16:32:59.722 : false 2021-10-19T16:33:03.723 : true 2021-10-19T16:33:11.727 : true 2021-10-19T16:33:11.727 : false 2021-10-19T16:33:16.731 : true 2021-10-19T16:33:16.732 : false 2021-10-19T16:33:17.735 : false 2021-10-19T16:33:22.738 : true 2021-10-19T16:33:28.741 : true 2021-10-19T16:33:29.741 : false 2021-10-19T16:33:30.744 : false