限流算法、RateLimiter

计数器算法(固定窗口算法)

概念:在一定的时间窗口内允许的固定数量的请求

//伪代码实现
//1.判断是否存在该key
if(EXIT(key)){
  // 1.1自增后判断是否大于最大值,并返回结果
  if(INCR(key) > maxPermit){
     return false;
  }
 return true;
}

//2.不存在key,则设置key初始值为1,失效时间为3秒
SET(KEY,1);
EXPIRE(KEY,3);

漏桶算法

概念:将请求放入到漏桶中,桶中的请求按照一定的速率出去。突发大流量请求,经过漏桶算法控制后,将以恒定的速率进入网络。当水流入速度过大会直接溢出。
在这里插入图片描述

令牌桶算法

定义:系统会以一个恒定的速度往桶里放入令牌,而如果请求需要被处理,则需要先从桶里获取一个令牌,当桶里没有令牌可取时,则拒绝服务。
在这里插入图片描述

主要区别:漏桶算法能够强行限制数据的传输速率,而令牌桶算法在能够限制数据的平均传输速率外,还允许某种程度的突发传输。在令牌桶算法中,只要令牌桶中存在令牌,那么就允许突发地传输数据直到达到用户配置的门限,所以它适合于具有突发特性的流量。
令牌桶算法用来保护自己,漏桶算法用来保护他人。

//伪代码实现
var key;
var maxPermit;//桶的容量,即最大请求限制
var expire;//失效时间

var bucketInterval;//每次向桶里添加令牌的时间间隔
var bucketNum;//每次向桶里添加令牌的个数

var lastTimeKey = key +"last";//标记上一次操作时间


//判断是否存在该key
if(EXIT(key)){
  var value = GET(key);
  var diffTime = now() - lastTimeKey;
  // 1.1判断是否超出时间间隔
  if(diffTime  > bucketInterval){
      // 1.2根据时间间隔,计算出应该向桶里添加令牌的个数
      local maxValue = value+math.floor(diff/interval)*step;
      if (maxValue > limit)
         value = limit;
      else
         value = maxValue;
     //设置key的值及操作时间
     SET(key,value);
     SET(lastTimeKey,now());     
  }
  
  // 2.1在时间间隔内,判断桶里是否有值
  if(value <= 0){
     reurn false;
  }else{
    // 2.2 减1
    DECR(key);
  }
reture true;
}


//2.不存在key,则设置key初始值为maxPermit-1
SET(key,maxPermit-1);
EXPIRE(lastTimeKey,now());

限流工具类RateLimiter

引入依赖

 <dependency>
   <groupId>com.google.guava</groupId>
   <artifactId>guava</artifactId>
   <version>28.0-jre</version>
 </dependency>

基本方法

create:设置每秒发出的令牌数
acquire()、tryAcquire():获取令牌

注:acquire是阻塞的且会一直等待到获取令牌为止,它有一个返回值为double型,意思是从阻塞开始到获取到令牌的等待时间,单位为秒。
tryAcquire可以指定超时时间,返回值为boolean型,即假设线程等待了指定时间后仍然没有获取到令牌,那么就会返回给客户端false,客户端根据自身情况是打回给前台错误还是定时重试。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值