高並發解決方案限流技術-----計數器


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分鍾,並且該計數器的值還在限流范圍內,那么重置該計數器


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM