本文实现了一种基于java的固定时间窗口计数器算法

固定时间窗口计数器算法思想:在固定的时间窗口内,可以允许固定数量的请求进入。超过数量就拒绝或者排队,等下一个时间段进入。

优点:和令牌桶相比,这种算法不需要去等待令牌生成的时间,在新的时间窗口,可以立即处理大量的请求。
缺点:在一个窗口临界点的前后时间,比如时间窗口是1分钟,在59秒和1分01秒同时突发大量请求,极端情况下可能会带来 2 倍的流量,系统可能承受不了这么大的突发性流量。

代码逻辑:新建一个本地缓存,每5s作为一个时间窗口,并作为缓存的key,原子类计数器作为缓存的value。每秒发送随机数量的请求,计算每个时间窗口内的请求数量,超出阈值则限流。

@Slf4j
public class WindowLimiter {//本地缓存,以时间戳为key,以原子类计数器为valueprivate LoadingCache<Long, AtomicLong> counter =CacheBuilder.newBuilder().expireAfterWrite(10, TimeUnit.SECONDS).build(new CacheLoader<Long, AtomicLong>() {@Overridepublic AtomicLong load(Long seconds) throws Exception {return new AtomicLong(0);}});private ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(5);//设置限流阈值为15private long limit = 15;/*** 固定时间窗口* 每隔5s,计算时间窗口内的请求数量,判断是否超出限流阈值*/private void fixWindow() {scheduledExecutorService.scheduleWithFixedDelay(() -> {try {// time windows 5 slong time = System.currentTimeMillis() / 5000;//每秒发送随机数量的请求int reqs = (int) (Math.random() * 5) + 1;long num = counter.get(time).addAndGet(reqs);log.info("time=" + time + ",num=" + num);if (num > limit) {log.info("限流了,num=" + num);}} catch (Exception e) {log.error("fixWindow error", e);} finally {}}, 0, 1000, TimeUnit.MILLISECONDS);}
}

输出结果:

20:04:55.508 [pool-1-thread-3] INFO com.example.demo.limit.WindowLimiter - time=314815739,num=4
20:04:56.510 [pool-1-thread-3] INFO com.example.demo.limit.WindowLimiter - time=314815739,num=7
20:04:57.516 [pool-1-thread-3] INFO com.example.demo.limit.WindowLimiter - time=314815739,num=10
20:04:58.521 [pool-1-thread-3] INFO com.example.demo.limit.WindowLimiter - time=314815739,num=11
20:04:59.526 [pool-1-thread-3] INFO com.example.demo.limit.WindowLimiter - time=314815739,num=14
20:05:00.553 [pool-1-thread-3] INFO com.example.demo.limit.WindowLimiter - time=314815740,num=3
20:05:01.553 [pool-1-thread-3] INFO com.example.demo.limit.WindowLimiter - time=314815740,num=5
20:05:02.558 [pool-1-thread-3] INFO com.example.demo.limit.WindowLimiter - time=314815740,num=9
20:05:03.564 [pool-1-thread-3] INFO com.example.demo.limit.WindowLimiter - time=314815740,num=14
20:05:04.569 [pool-1-thread-3] INFO com.example.demo.limit.WindowLimiter - time=314815740,num=17
20:05:04.570 [pool-1-thread-3] INFO com.example.demo.limit.WindowLimiter - 限流了,num=17

【限流算法】java实现固定时间窗口算法相关推荐

  1. 【面试大全-高并发】-限流策略有哪些,滑动窗口算法和令牌桶区别,使用场景

    参考思路:限流算法常用的几种实现方式有如下四种:计数器.滑动窗口.漏桶和令牌桶: ● 计数器: ○ 思想:在固定时间窗口内对请求进行计数,与阀值进行比较判断是否需要限流,一旦到了时间临界点,将计数器清 ...

  2. 限流算法-固定时间窗口

    本文介绍了固定时间窗口限流算法. 前言 首先限流的算法有很多种,比如固定时间窗口限流算法.滑动时间窗口算法.漏桶算法.令牌桶算法,其余的算法后续我们会一一介绍. 一.限流场景 站在服务调用方的角度来说 ...

  3. sentinel滑动时间窗口算法学习

    滑动时间窗口 先不说sentinel的算法实现,先说什么是滑动时间窗口, 我们在进行限流的时候,比如通过QPS进行限流,那假如我们以秒为单位,举个例子: 我设置了限流规则,qps是10 如果不使用滑动 ...

  4. sentinel 滑动时间窗口算法

    sentinel 滑动时间窗口的算法 为什么要用滑动时间窗口算法? 互联网中最常见的一个问题:限流,即在一段时间内,限制访问某个接口的请求数. 要实现限流(或熔断降级),方法有很多,最基本的如计数器法 ...

  5. PYTHON/JAVA实现固定时间且自动发送邮件的程序

    PYTHON 实现固定时间且自动发送邮件的程序 import smtplib from email.mime.text import MIMEText from email.header import ...

  6. Java 实现滑动时间窗口限流算法,你见过吗?

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | dijia478 来源 | https://w ...

  7. JAVA实现滑动时间窗口

    先上代码 package demo;import java.time.LocalTime; import java.util.LinkedList; import java.util.List; im ...

  8. 时间窗口算法用matlab,一种基于动态规划算法的时间窗口相关的参与者选择方法与流程...

    本发明涉及一种移动群智感知中时间窗口相关的参与者选择方法,特别地,涉及一种基于动态规划算法的时间窗口相关的参与者选择方法. 背景技术: 在移动群智感知网络中,智能设备中嵌入了麦克风.相机.温度传感器. ...

  9. 基于界面的银行家算法java实现_java实现银行家算法(Swing界面)

    java代码实现了银行家算法,界面写的个人认为还是较为细致的,完整的实现了找安全序列等算法功能,可作为参考学习银行家算法. 直接上代码:①界面展示方法: public void ShowFrame() ...

最新文章

  1. 苹果5年来盈利首次未超预期,但大中华区营收暴增83%
  2. Vue.js组件中v-model的使用
  3. ibatise 没有大于等于吗_库里+杜兰特并没有大于等于2!或许他和库里搭配将更强...
  4. 引用自己创建的css样式表_如何使用CSS创建联系表
  5. php 封装JavaScript类
  6. VC++ (四)动态内存
  7. 控件时出现“未能实例化控件******,VS2008 中无法使用ACTIVEX控件的解决
  8. 响应式设计就是这个时代最值得学习、时间的趋势
  9. 理解Visual Studio 解决方案文件格式(.sln)
  10. 双人五子棋游戏用C++实现
  11. msi2lmp不能用,mpi不能连接主机,解决办法看这里
  12. java商城答辩_毕业答辩-基于Java的网上购物商城的设计与实现.ppt
  13. 百度地图Javascript API 使用记录
  14. Spring 5.X+CXF 3.X 开发SOAP Web Service服务端实例
  15. 计算机组装与维修(一)
  16. 热度比肩以太坊的Cosmos生态现在发展得怎么样了?
  17. 解决Win10桌面和任务栏图标闪烁的问题
  18. 单个数码管动态显示(STM32F103C8T6)
  19. bzoj1123 BLO
  20. Day12:股海浮沉-锦囊妙计

热门文章

  1. linux io栈(读写流程)
  2. 【c#】键盘事件(keypress keydown keyup)
  3. 启用数据空间:让VirtualBox虚拟机中的Ubuntu 10.10和XP主机互通有无
  4. 设计模式之SOLID原则
  5. 微软学生中心DreamSpark
  6. h5页面跳转微信小程序页面
  7. 如果遇到提示错误 reactivity.esm-bundler.js?a1e9:337 Set operation on key “default“ failed: target is readonl
  8. python的知识体系_最新Python知识体系梳理
  9. 苹果审核报 3.2,如何解决
  10. 程序员带新人的几点思考