redis redisson 限流器示例(RRateLimiter)


redis redisson 限流器示例

 

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

 

****************************

相关接口

 

RRateLimiter

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();
}

 

RateType:速度类型

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

    private RateType() {
    }
}

 

RateInternalUnit:速度单位

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);
}

 

 

****************************

示例

 

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,5,2, RateIntervalUnit.MINUTES);

        ExecutorService executorService= Executors.newFixedThreadPool(10);
        for (int i=0;i<10;i++){
            executorService.submit(()->{
               try{
                   rateLimiter.acquire();
                   System.out.println("线程"+Thread.currentThread().getId()+"进入数据区:"+System.currentTimeMillis());
               }catch (Exception e){
                   e.printStackTrace();
               }
            });
        }
    }
}

 

********************

控制台输出

 

线程49进入数据区:1574672546522
线程55进入数据区:1574672546522
线程56进入数据区:1574672546526
线程50进入数据区:1574672546523
线程48进入数据区:1574672546523

线程51进入数据区:1574672666627
线程53进入数据区:1574672666627
线程54进入数据区:1574672666627
线程57进入数据区:1574672666628
线程52进入数据区:1574672666628

说明:可以看出在两分钟之内最多只有5个线程在执行

 

 

你可能感兴趣的:(redis)