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的分布式限流

 

posted @   Mars.wang  阅读(503)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
点击右上角即可分享
微信分享提示