首页 > 编程语言 >限流算法

限流算法

时间:2023-05-31 17:55:13浏览次数:28  
标签:10 return nowCount private 算法 限流 new public

固定窗口

缺陷:最简单,但是不能精确限制,由于是计算的时间差,比如每10秒只能10个请求,8-10秒请求了10个,那么10-18秒就也无法请求了


import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;

public class MyFixedWindow {

    private final    int maxCount= 10; //限制次数
    private final   int  windowUnit= 10 * 1000; // 单位时间 (毫秒)

    private AtomicInteger nowCount  ; //当前次数
    private AtomicLong lastTime; // 最后一次请求的时间

    public MyFixedWindow() {
            this.nowCount=new AtomicInteger(1);
            this.lastTime=new AtomicLong(0);
    }

    public synchronized boolean tryAcquire() {
        System.out.println("-----"+nowCount.get());
        long currentTime = System.currentTimeMillis();  //获取系统当前时间
        if(currentTime-lastTime.get()>windowUnit){// 如果当前时间减去上次请求的时间大于目标设置的时间,就重置
            nowCount.set(1);
            lastTime.set(currentTime);
            return true;
        }else {
            if(nowCount.get()>=maxCount){ //超过目标次数直接限流
                return false;
            }else{
                nowCount.incrementAndGet(); //否则自增1
                return true;
            }

        }
    }


}


   MyFixedWindow myFixedWindow= new MyFixedWindow();
    /**
     * 10 秒之内只能请求10次
     *
     * @return
     */
    @GetMapping("/test")
    public String test() {
        if(myFixedWindow.tryAcquire()){
                return "ok";
        }else {
            //执行降级
            return "请稍后再重试";
           // throw new RuntimeException();
        }
    }

可以看到限制没问题

标签:10,return,nowCount,private,算法,限流,new,public
From: https://www.cnblogs.com/AngeLeyes/p/17446906.html

相关文章

  • 欧几里得算法求最大公约数
    欧几里得算法又称辗转相除法,是指用于计算两个非负整数a,b的最大公约数。以除数和余数反复做除法运算,当余数为0时,取当前算式除数为最大公约数假如需要求18和30两个正整数的最大公约数:调用函数:print(gcd(18,30)),a,b值变化如下a    b30÷18=1……1218÷12=1……......
  • Snap算法学习01-02关于net节点、边、权值、标签的读写操作——netinf中cascades层级信
      Model可选值—— 0:exponential,  1:powerlaw,  2:rayleigh"                                      ......
  • Bellman-Ford算法——为什么要循环n-1次?图有n个点,又不能有回路,所以最短路径最多n-1边
    单源最短路径给定一个图,和一个源顶点src,找到从src到其它所有所有顶点的最短路径,图中可能含有负权值的边。Dijksra的算法是一个贪婪算法,时间复杂度是O(VLogV)(使用最小堆)。但是迪杰斯特拉算法在有负权值边的图中不适用,Bellman-Ford适合这样的图。在网络路由中,该算法会被用作距......
  • 算法总结——堆栈、字符串、数组类题目
    先说stack的题目stack的实现:链表,数组题目:(1)简单的:minstack,一个数组实现三个stack(2)经典的stack问题:经典汉诺塔问题,逆波兰式计算或者产生逆波兰式,简化文件路径,验证括号对是否合法,找出最长有效括号(贪心+stack求解)(3)涉及tree的遍历问题:tree中序遍历的迭代解法,二叉搜索树的两节点和(twosu......
  • 石子合并(GarsiaWachs算法)
    对于石子合并问题,有一个最好的算法,那就是GarsiaWachs算法。时间复杂度为O(n^2)。它的步骤如下:设序列是stone[],从左往右,找一个满足stone[k-1]<= stone[k+1]的k,找到后合并stone[k]和stone[k-1],再从当前位置开始向左找最大的j,使其满足stone[j]> stone[k]+stone[k-1],插到j的后面就......
  • python版本的“共轭梯度法”算法代码
    在看代码的过程中遇到了共轭梯度法这个概念,对这个算法的数学解释看过几遍,推导看过了,感觉懂了,然后过上一些日子就又忘记了,然后又看了一遍推导,然后过了一些日子也就又忘记了,最后想想这个算法的数学解释就不要再取深究了,毕竟平时也不太会用到,偶尔用到了只要保证代码会写也就OK了。 ......
  • Lucene默认的打分算法——ES默认
    改变Lucene的打分模型随着ApacheLucene4.0版本在2012年的发布,这款伟大的全文检索工具包终于允许用户修改默认的基于TF/IDF原理的打分算法。LuceneAPI变得更加容易修改和扩展打分公式。但是,对于文档的打分计算,Lucene并只是允许用户在打分公式上修修补补,Lucene4.0推出了更多的打......
  • BFGS算法
    今天,我来讲一种在机器学习中常用到的优化算法,叫做BFGS算法。BFGS算法被认为是数值效果最好的拟牛顿法,并且具有全局收敛性和超线性收敛速度。那么接下来将会详细讲解。Contents   1.什么是拟牛顿法  2.拟牛顿法原理  3.DFP算法原理  4.BFGS算法原理  5.BFGS算......
  • Java实战-基于JDK的LRU算法实现、优雅的实现代码耗时统计(Spring AOP、AutoCloseable
    场景Java中基于JDK的LRU算法实现LRU算法-缓存淘汰算法-Leastrecentlyused,最近最少使用算法根据数据的历史访问记录来进行淘汰数据,其核心思想是:如果有数据最近被访问过,那么将来被访问的几率也更高在Java中可以利用LinkedHashMap容器简单实现LRU算法LinkedHashMap底层就是用......
  • twitter僵尸网路检测,只能twitter自己做这种算法
     twitter僵尸网路检测数据样例 TwitterbotdetectorIntheprevioussections,wesawhowtobuildamachinelearning-basedbotnetdetector.Inthisnewproject,wearegoingtodealwithadifferentprobleminsteadofdefendingagainstbotnetmalware.Weareg......