RRateLimiter 限流器使用


作用

限制一段时间内对数据的访问数量

RateType

public enum RateType {
    OVERALL,             //所有客户端加总限流
    PER_CLIENT;          //每个客户端单独计算流量
 
    private RateType() {
    }
}

涉及方法

public interface RRateLimiter extends RRateLimiterAsync, RObject {
 
    boolean trySetRate(RateType var1, long var2, long var4, RateIntervalUnit var6);
                              //设置访问速率,var2为访问数,var4为单位时间,var6为时间单位
 
    void acquire();           //访问数据
    void acquire(long var1);  //占var1的速度计算值
 
    boolean tryAcquire();                                    //尝试访问数据
    boolean tryAcquire(long var1);                           //尝试访问数据,占var1的速度计算值
    boolean tryAcquire(long var1, TimeUnit var3);            //尝试访问数据,设置等待时间var3
    boolean tryAcquire(long var1, long var3, TimeUnit var5); //尝试访问数据,占数据计算值var1,设置等待时间var3
 
    RateLimiterConfig getConfig();
}

速率单位

public enum RateIntervalUnit {
    MILLISECONDS {
        public long toMillis(long value) {
            return value;
        }
    },
    SECONDS {
        public long toMillis(long value) {
            return TimeUnit.SECONDS.toMillis(value);
        }
    },
    MINUTES {
        public long toMillis(long value) {
            return TimeUnit.MINUTES.toMillis(value);
        }
    },
    HOURS {
        public long toMillis(long value) {
            return TimeUnit.HOURS.toMillis(value);
        }
    },
    DAYS {
        public long toMillis(long value) {
            return TimeUnit.DAYS.toMillis(value);
        }
    };
 
    private RateIntervalUnit() {
    }
 
    public abstract long toMillis(long var1);
}

用法示例 两分钟之内最多只有2个线程在执行

public class MyTest8 {
 
    public static void main(String[] args){
        Config config=new Config();
        config.useSingleServer().setAddress("redis://192.168.57.120:6379").setPassword("123456");
        RedissonClient client= Redisson.create(config);
 
        RRateLimiter rateLimiter=client.getRateLimiter("rate_limiter");
        rateLimiter.trySetRate(RateType.PER_CLIENT,2,2, RateIntervalUnit.MINUTES);
 
        ExecutorService executorService= Executors.newFixedThreadPool(10);
        for (int i=0;i<10;i++){
            executorService.submit(()->{
               try{
                  if (rateLimiter.tryAcquire()) {
                      System.out.println("线程"+Thread.currentThread().getId()+"进入数据区:"+System.currentTimeMillis());
                  }
               }catch (Exception e){
                   e.printStackTrace();
               }
            });
        }
    }
}

控制台输出

线程49进入数据区:1574672546522
线程55进入数据区:1574672546522

 
线程51进入数据区:1574672666627
线程53进入数据区:1574672666627