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