zoukankan      html  css  js  c++  java
  • springboot访问限流(转)

    https://zhuanlan.zhihu.com/p/60979444

    https://www.cnblogs.com/leeego-123/p/11492822.html

    https://www.cnblogs.com/liuqing576598117/p/11451474.html

    https://www.jianshu.com/p/404aa2747809

    https://zhuanlan.zhihu.com/p/72980217

    一、RateLimiter

    RateLimiter是guava实现的令牌桶算法,看起来跟Semaphore非常像,其实有所不同。

    Semaphore用于处理同时并发访问的资源数量,使用的时候先获取再释放。

    RateLimiter的令牌每秒都在产生,比如下面的代码,每秒产生5个令牌,用于限制一个时间范围内的访问次数,令牌只需要获取不用释放。

        private static RateLimiter rateLimiter = RateLimiter.create(5);
    
        public static void main(String[] args) throws InterruptedException {
            while (true) {
                get(1);
            }
        }
    
        private static void get(int permits) {
            rateLimiter.acquire(permits);
            System.out.println(System.currentTimeMillis());
        }

    二、令牌桶算法和漏桶算法

    基于漏桶(桶+恒定处理速率),可以起到对请求整流效果。漏桶算法可基于线程池来实现,线程池使用固定容量的阻塞队列+固定个数的处理线程来实现;最简单且最常见的漏桶思想的实现就是基于SynchronousQueue的线程池,其相当于一个空桶+固定处理线程 : )

    令牌桶算法的原理是系统以恒定的速率产生令牌,然后把令牌放到令牌桶中,令牌桶有一个容量,当令牌桶满了的时候,再向其中放令牌,那么多余的令牌会被丢弃;当想要处理一个请求的时候,需要从令牌桶中取出一个令牌,如果此时令牌桶中没有令牌,那么则拒绝该请求。

    三、基于Redis限流

    基于Redis做限流操作,使用lua脚本保证命令原子性,比如qps设置为10,如果key不存在,就设置key过期时间1s,value=1;如果value小于10,则自增value;value达到10

    四、基于Nginx的分布式限流

  • 相关阅读:
    非常可乐
    Find The Multiple
    盲点集锦
    Fliptile
    Catch That Cow
    Dungeon Master
    hdoj 1045 Fire Net
    hdoj 1342 Lotto【dfs】
    zoj 2100 Seeding
    poj 3620 Avoid The Lakes【简单dfs】
  • 原文地址:https://www.cnblogs.com/wangbin2188/p/15211422.html
Copyright © 2011-2022 走看看