Skip to content

Latest commit

 

History

History
42 lines (33 loc) · 1.56 KB

令牌桶算法.md

File metadata and controls

42 lines (33 loc) · 1.56 KB

概念

  • 有一个大小恒定的桶,这个桶的容量和设定的阈值有关,桶里放着很多令牌。
  • 通过一个固定的速率,往里边放入令牌,如果桶满了,就把令牌丢掉。
  • 当有请求进入时,就尝试从桶里取走一个令牌,如果桶里是空的,那么这个请求就会被拒绝。

实现

rateLimiter提供了acquire()和tryAcquire()接口:

  • 使用acquire()方法,如果没有可用令牌,会一直阻塞直到有足够的令牌
  • 使用tryAcquire()方法,如果没有可用令牌,就直接返回false
  • 使用tryAcquire()带超时时间的方法,如果没有可用令牌,就会判断在超时时间内是否可以等到令牌,如果不能,就返回false,如果可以,就阻塞等待
/**
 * Guava
 * Thread.sleep(100L); 可以测试速度以及成功率
 * @author lizhifu
 * @date 2021/1/13
 */
public class LimiterTest {
    public static void main(String[] args) throws InterruptedException {
        RateLimiter limiter = RateLimiter.create(100);
        Thread.sleep(100L);
        for(int i=1;i<100;i++){
            if (limiter.tryAcquire(1, TimeUnit.MILLISECONDS)){
                System.out.println("第"+i+"次请求成功");
            }else{
                System.out.println("第"+i+"次请求拒绝");
            }
        }
    }
}

代码地址:spring-boot-guava-limit

redis实现令牌桶算法

令牌桶算法