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