最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中實現(xiàn)接口限流的方案詳解

 更新時間:2023年05月31日 11:19:09   作者:iiopsd  
常用的接口限流方案就是計數(shù)器限流方案、時間窗口限流方案和令牌桶限流方案等,這些方案的概念大致也知道,但是實際上也沒有實現(xiàn)過,所以本文就來自動動手實踐一下吧

前言

今天看技術(shù)文章時看到一篇文章在討論接口限流問題,覺得業(yè)務(wù)場景經(jīng)常會使用到,就思考了一下如果是我會怎么實現(xiàn)?常用方案就是計數(shù)器限流方案、時間窗口限流方案和令牌桶限流方案等。這些方案的概念大致也知道,但是實際上也沒有實現(xiàn)過,于是就自己試試實現(xiàn)邏輯,先動手再說。

場景

假設(shè)我們的場景是:

接口10秒內(nèi)最多請求3次

思路

我想到的實現(xiàn)思路是有點時間窗口方案的樣子,大致就是緩存請求時間,然后在每次請求的時候去校驗10秒內(nèi)是否超過3次請求。

圖示

假設(shè)下面是請求的時間(單位:秒),那么前三次都可以請求成功,一個大小為3的數(shù)組緩存數(shù)據(jù)cache就是紅框所示:

接下去的第四個請求、第五個請求和第一個緩存時間對比,發(fā)現(xiàn)都小于10秒,則請求不通過。

第六個請求時間和第一個請求時間對比,時間大于10秒,所以請求通過,然后更新緩存數(shù)據(jù)cache,緩存的第一個數(shù)據(jù)改為第二個請求時間,緩存第二個數(shù)據(jù)改為第三個請求時間,緩存第三個數(shù)據(jù)改為第6個請求時間,如下圖藍框所示,依次類推校驗每次請求是否符合場景要求。

實現(xiàn)

1.聲明一個數(shù)組cache(數(shù)組大小可以為最大請求次數(shù)3),儲存請求時間;

因為我們要對比請求時間,所以講請求緩存下來可以節(jié)省查數(shù)據(jù)庫的時間。因為場景說明限制3次,所以我們只需要知道最后3個請求的時間就可以完成校驗,之前的數(shù)據(jù)可以忽略。

2.首先是初始化情況,當請求小于3的時候,請求直接通過,并緩存當前請求時間;

3.當請求大于等于3的時候,判斷當前請求時間和倒數(shù)第三次請求(cache[0]的數(shù)據(jù))的間隔時間是否超過10秒,如果是則通過,否則通過。

通過的時候,要更新緩存數(shù)據(jù),將數(shù)據(jù)前移,這次請求時間就是最后一次請求時間。

// 更新緩存
cache.set(0, cache.get(1));
cache.set(1, cache.get(2));
cache.set(2, now);

4.最后執(zhí)行下代碼驗證下結(jié)果

完整代碼如下所示:

package demo;
import cn.hutool.core.date.DateUtil;
import lombok.SneakyThrows;
import lombok.val;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Random;
/**
 * 限流示例,每分鐘只能請求3次
 */
public class LimitFlowDemo {
    // 記錄最后3次請求時間
    List<Long> cache = new ArrayList<>();
    int limitTime = 10;
    public boolean validate() {
        boolean res = false;
        val now = DateUtil.currentSeconds();
        System.out.println("當前時間:" + DateUtil.format(new Date(now * 1000), "HH:mm:ss"));
        if (cache.size() < 3) {
            res = true;
            cache.add(now);
        } else if(now - cache.get(0) > limitTime){
            res = true;
            // 更新緩存
            cache.set(0, cache.get(1));
            cache.set(1, cache.get(2));
            cache.set(2, now);
        }
        System.out.println("請求結(jié)果:" + res);
        return res;
    }
    @SneakyThrows
    public static void main(String[] args) {
        Random rd = new Random();
        LimitFlowDemo demo = new LimitFlowDemo();
        for (int i = 0; i < 1000; i++) {
            demo.validate();
            //            Thread.sleep(rd.nextInt(3000));
            Thread.sleep(500);
        }
    }
}

到此這篇關(guān)于Java中實現(xiàn)接口限流的方案詳解的文章就介紹到這了,更多相關(guān)Java接口限流內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

  • 如何通過自定義spring?invalidator注解校驗數(shù)據(jù)合法性

    如何通過自定義spring?invalidator注解校驗數(shù)據(jù)合法性

    這篇文章主要介紹了如何通過自定義spring?invalidator注解校驗數(shù)據(jù)合法性,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • Java的反射機制之類加載詳解

    Java的反射機制之類加載詳解

    這篇文章主要介紹了Java的反射機制之類加載詳解,反射機制是java實現(xiàn)動態(tài)語言的關(guān)鍵,也就是通過反射實現(xiàn)類動態(tài)加載,靜態(tài)加載是指在編譯時期確定要加載的類的類型,即通過class關(guān)鍵字和類名來獲取對應(yīng)類的類型,需要的朋友可以參考下
    2023-09-09
  • java double保留兩位小數(shù)問題

    java double保留兩位小數(shù)問題

    在Java中,可以使用DecimalFormat或String.format來保留double類型數(shù)字的兩位小數(shù),這兩個方法都會進行四舍五入
    2025-03-03
  • Spring mvc如何實現(xiàn)數(shù)據(jù)處理

    Spring mvc如何實現(xiàn)數(shù)據(jù)處理

    這篇文章主要介紹了Spring mvc如何實現(xiàn)數(shù)據(jù)處理,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-03-03
  • SpringCloud使用集中配置組件Config規(guī)避信息泄露

    SpringCloud使用集中配置組件Config規(guī)避信息泄露

    項目應(yīng)用中,數(shù)據(jù)庫連接信息、Access-key、Secret-key等由于其及其敏感和特殊性,一旦泄露出去就很可能會使得應(yīng)用遭到黑客攻擊,例如數(shù)據(jù)庫賬號密碼泄露可能導(dǎo)致“拖庫”,甚至數(shù)據(jù)丟失。此等事件偶有發(fā)生,那么,在分布式微服務(wù)項目中,怎么避免這種情況呢
    2022-07-07
  • SpringBoot在 POM 中引入本地 JAR 包的方法

    SpringBoot在 POM 中引入本地 JAR 包的方法

    在開發(fā) Spring Boot 應(yīng)用程序時,您可能需要使用本地 JAR 包來添加自定義庫或功能,本文將介紹在 Spring Boot 項目的 POM 文件中如何引入本地 JAR 包,感興趣的朋友跟隨小編一起看看吧
    2023-08-08
  • Maven引入與打包指定目錄下的第三方sdk的幾種方法

    Maven引入與打包指定目錄下的第三方sdk的幾種方法

    本文主要介紹了Maven引入與打包指定目錄下的第三方sdk的幾種方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-09-09
  • java的繼承原理與實現(xiàn)方法詳解

    java的繼承原理與實現(xiàn)方法詳解

    這篇文章主要介紹了java的繼承原理與實現(xiàn)方法,結(jié)合實例形式詳細分析了Java繼承的概念、原理、用法及相關(guān)操作注意事項,需要的朋友可以參考下
    2019-05-05
  • Java實現(xiàn)TCP和UDP協(xié)議詳解

    Java實現(xiàn)TCP和UDP協(xié)議詳解

    這篇文章主要介紹了Java實現(xiàn)TCP和UDP協(xié)議詳解,TCP(傳輸控制協(xié)議)和UDP(用戶數(shù)據(jù)報協(xié)議)是兩種最常用的傳輸層協(xié)議,它們都用于在網(wǎng)絡(luò)上傳輸數(shù)據(jù),但是它們之間有很多不同之處,需要的朋友可以參考下
    2023-07-07
  • 最新評論

    当涂县| 鄂州市| 清水县| 新建县| 库尔勒市| 邯郸市| 措美县| 蓬莱市| 格尔木市| 固安县| 上饶县| 德昌县| 偃师市| 子洲县| 五莲县| 商水县| 巫山县| 泰和县| 运城市| 开阳县| 永清县| 松阳县| 延吉市| 科技| 青河县| 灯塔市| 甘洛县| 星子县| 双流县| 万盛区| 开封县| 图们市| 略阳县| 东阳市| 筠连县| 平和县| 马边| 五华县| 康定县| 福州市| 托克逊县|