基于Redis组件之分布式RateLimiter限流

上文我们介绍了RateLimiter文章路径针对IP来限流的方式,上文的限流方案,只针对单应用情况,分布式集群下就不能使用上文的方式,分布式下的限流方案有很多种,这边展示的是Redis的封装redission框架。
可以这么讲,jdk中的juc包提供的是单机版的并发业务。那么Redisson基本是基于juc实现的分布式的业务。

一:Redission官网

我们先去Redission官网喵喵
redission官方地址
基于Redis组件之分布式RateLimiter限流_第1张图片
我们可以看到wiki提供了很多功能介绍,
分布式锁等,我们这篇文章主要讲限流。进入正题
基于Redis组件之分布式RateLimiter限流_第2张图片
我们看到如下有个限流器,我们点进去看看
基于Redis组件之分布式RateLimiter限流_第3张图片
基于Redis组件之分布式RateLimiter限流_第4张图片

1:依赖版本

org.redisson.redisson 3.11.4


    org.redisson
    redisson-spring-boot-starter
    3.11.4

2:限流器(RRateLimiter)

仔细看,它和谷歌guava实现的限流器(RateLimiter)名字很像,多了一个R。它支持在分布式环境下,现在调用方的请求频率,可以实现不同Redisson实例下的多线程限流,也适用于相同实例Redisson下的多线程限流。是非公平性阻塞。

3:API接口文档

基于Redis组件之分布式RateLimiter限流_第5张图片
当前版本提供了6个方法,其余都是重载
针对每个方法的注释讲解下作用

3.1:acquire()

根据注释过来的意思:
从此RateLimiter处获取许可,直到获得一个许可为止。
可以知道,是一个阻塞限流,直到获取到令牌。那我们可以对其分析一下源代码
基于Redis组件之分布式RateLimiter限流_第6张图片
首先我们看下注释

3.1.1:tryAcquire()

仅在调用时可用时才获得许可。
如果有许可证,则获取许可证,然后立即返回,其值为true,将可用许可证的数量减少一个。
如果没有可用的许可,则此方法将立即返回值false。
返回值:
true如果获得许可证,false 否则

3.1.2:tryAcquire(long permits)

permits仅在调用时全部可用时才获取给定数量。
如果所有许可证都可用,则获取许可证,然后立即返回值true,将值减少给定许可证数量的可用许可证数量。
如果没有可用的许可证,则此方法将立即返回值false。
参数:
permits -获得许可证的数量
返回值:
true如果获得许可证,false 否则

4:源码分析

分析之前我们先把依赖引入maven项目并分析,见步骤二:
根据官方文档,
添加测试类


@Autowired
private RedissonClient redissonClient;

RRateLimiter myRateLimter = redissonClient.getRateLimiter("myRateLimter");
myRateLimter.tryAcquire();

在这里插入图片描述
源码:
基于Redis组件之分布式RateLimiter限流_第7张图片
我们进入实现类看看:
基于Redis组件之分布式RateLimiter限流_第8张图片

基于Redis组件之分布式RateLimiter限流_第9张图片
我们这里可以看到都给到了一个默认值1,一个许可证的数量
我们从它内部调用的方法见:public RFutrue acquireAsync(long permits);分析一下
基于Redis组件之分布式RateLimiter限流_第10张图片
先创建异步计算对象promise ,然后再调用方法tryAcquireAsync(permits, -1, null),然后将其结果,通过RFutrue返回。
我们再看看它的重载方法

public RFuture tryAcquireAsync(long permits, long timeout, TimeUnit unit) 

基于Redis组件之分布式RateLimiter限流_第11张图片
看内部的代码,该对象,基本上所有的方法都是最终指向了上方法,只是参数,我们都封装好了。便于直接调用。

我们现在来分析下如上的方法到底做了什么事情
我们设定的超时时间统一转换为毫秒值,如果是-1,则不转换,直接为-1.
再定义一个异步任务,传递到tryAcquireAsync(permits, promise, timeoutInMillis);
我们看看源码
基于Redis组件之分布式RateLimiter限流_第12张图片首先我们注意到的是,当前方法是私有的
第一行代码,

<

你可能感兴趣的:(Java,优化,java,分布式,redisson)