1. 程式人生 > 其它 >Java實現滑動時間視窗限流

Java實現滑動時間視窗限流

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