欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

前言

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

場(chǎng)景

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

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

思路

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

圖示

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

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

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

實(shí)現(xiàn)

1.聲明一個(gè)數(shù)組cache(數(shù)組大小可以為最大請(qǐng)求次數(shù)3),儲(chǔ)存請(qǐng)求時(shí)間;

因?yàn)槲覀円獙?duì)比請(qǐng)求時(shí)間,所以講請(qǐng)求緩存下來可以節(jié)省查數(shù)據(jù)庫(kù)的時(shí)間。因?yàn)閳?chǎng)景說明限制3次,所以我們只需要知道最后3個(gè)請(qǐng)求的時(shí)間就可以完成校驗(yàn),之前的數(shù)據(jù)可以忽略。

2.首先是初始化情況,當(dāng)請(qǐng)求小于3的時(shí)候,請(qǐng)求直接通過,并緩存當(dāng)前請(qǐng)求時(shí)間;

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

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

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

4.最后執(zhí)行下代碼驗(yàn)證下結(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;
/**
 * 限流示例,每分鐘只能請(qǐng)求3次
 */
public class LimitFlowDemo {
    // 記錄最后3次請(qǐng)求時(shí)間
    List<Long> cache = new ArrayList<>();
    int limitTime = 10;
    public boolean validate() {
        boolean res = false;
        val now = DateUtil.currentSeconds();
        System.out.println("當(dāng)前時(shí)間:" + 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("請(qǐng)求結(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中實(shí)現(xiàn)接口限流的方案詳解的文章就介紹到這了,更多相關(guān)Java接口限流內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringCloud Feign轉(zhuǎn)發(fā)請(qǐng)求頭(防止session失效)的解決方案

    SpringCloud Feign轉(zhuǎn)發(fā)請(qǐng)求頭(防止session失效)的解決方案

    這篇文章主要介紹了SpringCloud Feign轉(zhuǎn)發(fā)請(qǐng)求頭(防止session失效)的解決方案,本文給大家分享兩種解決方案供大家參考,感興趣的朋友跟隨小編一起看看吧
    2020-10-10
  • Java中的運(yùn)算符有哪些詳解

    Java中的運(yùn)算符有哪些詳解

    這篇文章主要給大家介紹了關(guān)于Java中運(yùn)算符有哪些的相關(guān)資料,包括算術(shù)運(yùn)算符、關(guān)系運(yùn)算符、邏輯運(yùn)算符、位運(yùn)算符、增量運(yùn)算符和自增/自減運(yùn)算符,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-10-10
  • SpringBoot實(shí)現(xiàn)文件下載的限速功能

    SpringBoot實(shí)現(xiàn)文件下載的限速功能

    在SpringBoot項(xiàng)目中,實(shí)現(xiàn)文件下載的限速功能可以有效控制服務(wù)器帶寬的占用,并防止單個(gè)用戶消耗過多的資源,本文將通過具體的代碼示例和詳細(xì)的流程解釋,介紹如何在SpringBoot項(xiàng)目中實(shí)現(xiàn)文件下載的限速功能,需要的朋友可以參考下
    2024-07-07
  • Java構(gòu)造函數(shù)通透理解篇

    Java構(gòu)造函數(shù)通透理解篇

    這篇文章主要介紹了Java構(gòu)造函數(shù),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • Mybatis-plus中IService接口的基本使用步驟

    Mybatis-plus中IService接口的基本使用步驟

    Mybatis-plus是一個(gè)Mybatis的增強(qiáng)工具,它提供了很多便捷的方法來簡(jiǎn)化開發(fā),IService是Mybatis-plus提供的通用service接口,封裝了常用的數(shù)據(jù)庫(kù)操作方法,包括增刪改查等,下面這篇文章主要給大家介紹了關(guān)于Mybatis-plus中IService接口的基本使用步驟,需要的朋友可以參考下
    2023-06-06
  • Java RandomAccessFile的用法詳解

    Java RandomAccessFile的用法詳解

    下面小編就為大家?guī)硪黄狫ava RandomAccessFile的用法詳解。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-06-06
  • Java實(shí)現(xiàn)AOP面向切面編程的實(shí)例教程

    Java實(shí)現(xiàn)AOP面向切面編程的實(shí)例教程

    這篇文章主要介紹了Java實(shí)現(xiàn)AOP面向切面編程的實(shí)例教程,通常Java中的AOP都是利用Spring框架中造好的輪子來開發(fā),而本文則關(guān)注于Java本身AOP的設(shè)計(jì)模式實(shí)現(xiàn),需要的朋友可以參考下
    2016-04-04
  • 記一次Feign中實(shí)現(xiàn)傳實(shí)體Bean的問題

    記一次Feign中實(shí)現(xiàn)傳實(shí)體Bean的問題

    這篇文章主要介紹了記一次Feign中如何傳實(shí)體Bean的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • 使用Spring和Redis創(chuàng)建處理敏感數(shù)據(jù)的服務(wù)的示例代碼

    使用Spring和Redis創(chuàng)建處理敏感數(shù)據(jù)的服務(wù)的示例代碼

    許多公司處理的用戶敏感數(shù)據(jù)由于法律限制不能永久存儲(chǔ),根據(jù)規(guī)定,這些數(shù)據(jù)的存儲(chǔ)時(shí)間不能超過預(yù)設(shè)期限,并且最好在用于服務(wù)目的之后就將其刪除,解決這個(gè)問題有多種可能的方案,在本文中,我想展示一個(gè)利用 Spring 和 Redis 處理敏感數(shù)據(jù)的應(yīng)用程序的簡(jiǎn)化示例
    2025-04-04
  • Spring IOC與DI核心重點(diǎn)分析

    Spring IOC與DI核心重點(diǎn)分析

    IOC也是Spring的核心之一了,之前學(xué)的時(shí)候是采用xml配置文件的方式去實(shí)現(xiàn)的,后來其中也多少穿插了幾個(gè)注解,但是沒有說完全采用注解實(shí)現(xiàn)。那么這篇文章就和大家分享一下,全部采用注解來實(shí)現(xiàn)IOC + DI
    2022-10-10

最新評(píng)論