基于 Redisson 的限流 小 demo

摘要:
redisson<版本>importorg.redisson.api.*;static{Configconfig=newConfig();Randomrd=newRandom();for(inti=0;i<}).start();尝试{Thread.sleep(5000);

引包:

<!--Redisson插件-->
<dependency>
  <groupId>org.redisson</groupId>
  <artifactId>redisson</artifactId>
  <version>3.10.2</version>
</dependency>

java 类:

package com..distributed;

import org.redisson.Redisson;
import org.redisson.api.*;
import org.redisson.config.Config;
import java.util.Random;
import java.util.concurrent.CountDownLatch;

public class RedisRateLimiter {

    static RedissonClient redisson = null;
    static RRateLimiter myLimiter;

    static {
        Config config = new Config();
        config.useSingleServer().setAddress("redis://127.0.0.1:6379").setConnectionMinimumIdleSize(10);
        //创建Redisson客户端
        redisson = Redisson.create(config);

        /**
         * 基于Redis的分布式限流器可以用来在分布式环境下现在请求方的调用频率。
         * 既适用于不同Redisson实例下的多线程限流,也适用于相同Redisson实例下的多线程限流。
         * 该算法不保证公平性。
         */
        myLimiter = redisson.getRateLimiter("my");

        /**
         * Total rate for all RateLimiter instances
         * 作用在所有的RRateLimiter实例
         * OVERALL
         *
         * Total rate for all RateLimiter instances working with the same Redisson instance
         * 作用在同一个Redisson实例创建的 RRateLimiter上面。
         * PER_CLIENT
         *
         * return : 设置是否成功。 对同一个redis服务端,只需要设置一次。如果redis重启需要重新设置
         */
        boolean bl = myLimiter.trySetRate(RateType.PER_CLIENT, 5, 1, RateIntervalUnit.SECONDS);
    }


    //结合redis,实现分布式的qpi接口限流
    public static void test() {

        CountDownLatch cd = new CountDownLatch(1);
        Random rd = new Random();

        for (int i = 0; i < 20; i++) {
            new Thread(() -> {

                try {
                    cd.await(); //使得当前线程阻塞
                    Thread.sleep(rd.nextInt(1000)); //模拟20个请求的并发,有一点点先后顺序的差异
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {

                    //获取令牌
                    System.out.println(Thread.currentThread().getName() + " : " + myLimiter.tryAcquire());
                }

            }).start();
        }

        cd.countDown();
    }

    public static void main(String[] args) {

        test();
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //正常退出 status为0时为正常退出程序,也就是结束当前正在运行中的java虚拟机
        System.exit(0);
    }

}

运行结果 只有5个成功 :

基于 Redisson 的限流 小 demo第1张

免责声明:文章转载自《基于 Redisson 的限流 小 demo》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇使用Git Wiki 管理文档时,文档编写的基本用法umount:将文件设备卸载下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

stm32 cortext-M3 类型对齐问题【worldsing笔记】

经过细测,Cortex-M3的double类型必须4字节对齐访问,其他诸如float,int,short 可以非对齐访问。否则将会产生硬件异常!即访问double类型地址必须能被4整除,测试代码如下: 1: /* 测试Cortex-M3类型对齐访问 2: * i,j,k,l控制对齐长度,对齐 3: * 长度不符合是将产生HardFa...

Java设计模式学习记录-观察者模式

前言 观察者模式也是对象行为模式的一种,又叫做发表-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、 咱们目前用的最多的就是各种MQ(Message Queue)都是基于这个模式的思想来实现的,生产者产生数据放到一个队列中,消费者观察生产者的消息队列的变化,从而接收消息,执行消费者本身的逻辑。 观察者模式 概念介绍...

OGNL表达式入门

package com.scorpion.ognl; import java.util.ArrayList; import java.util.List; import ognl.Ognl; import ognl.OgnlContext; import ognl.OgnlException; public class OgnlTest {...

c语言_头文件_windows.h

概述 Win32程序的开头都可看到: #include <windows.h> WINDOWS.H是一个最重要的头文件,它包含了其他Windows头文件,这些头文件的某些也包含了其他头文件。这些头文件中最重要的和最基本的是: WINDEF.H 基本数据类型定义。 WINNT.H 支持Unicode的类型定义。 WINBASE.H Kernel(...

WebService客户端调用常见5种方式

之前系统中使用到了webservice进行第三方通信,这里总结一下常见的5种客户端调用方式。 在此之前我们先简单搭建一个webservice服务端项目,发布一个webservice服务。我这里使用springboot快速搭建一个,项目结构如下: 创建一个springboot项目,导入maven依赖: <dependency> <...

指针偏移量的理解

今天刷题的时候碰到如下的一道题: int main() { int array[2019] = { 0 }; array[19] = 2019; unsigned long offset = (unsigned long)((short*)array + 2019) - (unsigned long)(array + *(unsigned char...