1.它是限流算法中最简单最容易的一种算法

计数器实现限流 每分钟只允许10个请求 第一个请求进去的时间为startTime,在startTime + 60s内只允许10个请求

当60s内超过十个请求后,拒绝,不超过,到第60s 重新设置时间

package com.aiyuesheng.utils;

import java.util.concurrent.atomic.AtomicInteger;
import lombok.Getter;
import lombok.Setter; /**
* @author chris
* @see 计数器实现限流 每分钟只允许10个请求 第一个请求进去的时间为startTime,在startTime + 60s内只允许10个请求
* 当60s内超过十个请求后,拒绝,不超过,到第60s 重新设置时间
*/
@Setter
@Getter
public class LimitService {
// 限流的个数
private int maxCount = 10;
// 指定的时间内
private long interval = 60;
// 原子类计数器
private AtomicInteger atomicInteger = new AtomicInteger(0);
// 起始时间
private long startTime = System.currentTimeMillis(); public boolean limit(int maxCount, int interval) {
atomicInteger.addAndGet(1);
if (atomicInteger.get() == 1) {
startTime = System.currentTimeMillis();
atomicInteger.addAndGet(1);
return true;
}
// 超过了间隔时间,直接重新开始计数
if (System.currentTimeMillis() - startTime > interval * 1000) {
startTime = System.currentTimeMillis();
atomicInteger.set(1);
return true;
}
// 还在间隔时间内,check有没有超过限流的个数
if (atomicInteger.get() > maxCount) {
return false;
}
return true;
}
}

它是限流算法中最简单最容易的一种算法,比如我们要求某一个接口,1分钟内的请求不能超过10次,我们可以在开始时设置一个计数器,每次请求,该计数器+1;如果该计数器的值大于10并且与第一次请求的时间间隔在1分钟内,那么说明请求过多,如果该请求与第一次请求的时间间隔大于1分钟,并且该计数器的值还在限流范围内,那么重置该计数器

引文:https://www.cnblogs.com/pickKnow/p/11252120.html

最新文章

  1. HTTP 使用期及新鲜度算法
  2. Git 版本库添加空目录方法
  3. JS中的String.Math.Date
  4. IOS Xcode7 新建PCH文件
  5. Graph-tool简介 - wiki
  6. Ubuntu 14.04下java开发环境的搭建--3--Tomcat及MySQL的安装
  7. Android 出现警告Exported service does not require permission
  8. delphi 打开文件夹并定位到一个文件(使用ShellExecute时加一个select参数,原来这么简单!)
  9. spring的定时执行代码 跑批
  10. Sprite Kit教程:制作一个通用程序 2
  11. openCV(四)---Canny边缘检测
  12. Git diff 统计代码更改数量
  13. 转:centos 7 安装音频视频解码器
  14. a标签中href属性引起的页面不跳转问题
  15. 流程控制之if判断,while循环,for循环
  16. 关于jQuery.ajax()的jsonp碰上post详解
  17. Java知多少(41)泛型详解
  18. Mysql 性能优化7【重要】sql语句的优化 浅谈MySQL中优化sql语句查询常用的30种方法(转)
  19. XiaoKL学Python(E)Generator Expressions
  20. Android逆向 破解第一个Android程序

热门文章

  1. 分布式系统一致性问题与Raft算法(下)
  2. 一文看懂js中元素的滚动大小(scrollWidth,scrollHeight,scrollTop,scrollLeft)
  3. java反序列化-ysoserial-调试分析总结篇(6)
  4. 端口占用的一种形式 Failed to initialize end point associated with ProtocolHandler ["ajp-bio-8090"] java.net.BindException: Address already in use: JVM_Bind <null>:8090
  5. vue 组件中添加样式不生效
  6. postgreSQL外键引用查询 查询外键被那些表占用
  7. 2653 区间xor
  8. Spring源码阅读笔记05:自定义xml标签解析
  9. JVM03——四种垃圾回收算法,你都了解了哪几种
  10. mysql中实现更新数据+1,再次更新数据-1