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的分布式限流
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗