1.它是限流算法中最簡單最容易的一種算法
計數器實現限流 每分鍾只允許10個請求 第一個請求進去的時間為startTime,在startTime + 60s內只允許10個請求
當60s內超過十個請求后,拒絕,不超過,到第60s 重新設置時間
package com.aiyuesheng.utils; import java.util.concurrent.atomic.AtomicInteger; import lombok.Getter; import lombok.Setter; /** * @author chris * @see 計數器實現限流 每分鍾只允許10個請求 第一個請求進去的時間為startTime,在startTime + 60s內只允許10個請求 * 當60s內超過十個請求后,拒絕,不超過,到第60s 重新設置時間 */ @Setter @Getter public class LimitService { // 限流的個數 private int maxCount = 10; // 指定的時間內 private long interval = 60; // 原子類計數器 private AtomicInteger atomicInteger = new AtomicInteger(0); // 起始時間 private long startTime = System.currentTimeMillis(); public boolean limit(int maxCount, int interval) { atomicInteger.addAndGet(1); if (atomicInteger.get() == 1) { startTime = System.currentTimeMillis(); atomicInteger.addAndGet(1); return true; } // 超過了間隔時間,直接重新開始計數 if (System.currentTimeMillis() - startTime > interval * 1000) { startTime = System.currentTimeMillis(); atomicInteger.set(1); return true; } // 還在間隔時間內,check有沒有超過限流的個數 if (atomicInteger.get() > maxCount) { return false; } return true; } }
它是限流算法中最簡單最容易的一種算法,比如我們要求某一個接口,1分鍾內的請求不能超過10次,我們可以在開始時設置一個計數器,每次請求,該計數器+1;如果該計數器的值大於10並且與第一次請求的時間間隔在1分鍾內,那么說明請求過多,如果該請求與第一次請求的時間間隔大於1分鍾,並且該計數器的值還在限流范圍內,那么重置該計數器