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

滑动时间窗口计数器算法思想:针对固定时间算法会在临界点存在瞬间大流量冲击的场景,滑动时间窗口计数器算法应运而生。它将时间窗口划分为更小的时间片段,每过一个时间片段,我们的时间窗口就会往右滑动一格,每个时间片段都有独立的计数器。我们在计算整个时间窗口内的请求总数时会累加所有的时间片段内的计数器。时间窗口划分的越细,那么滑动窗口的滚动就越平滑,限流的统计就会越精确。

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

@Slf4j
public class WindowLimiter {private 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);//限流阈值private long limit = 15;/*** 滑动时间窗口* 每隔1s累加前5s内每1s的请求数量,判断是否超出限流阈值*/public void slideWindow() {scheduledExecutorService.scheduleWithFixedDelay(() -> {try {long time = System.currentTimeMillis() / 1000;//每秒发送随机数量的请求int reqs = (int) (Math.random() * 5) + 1;counter.get(time).addAndGet(reqs);long nums = 0;// time windows 5 sfor (int i = 0; i < 5; i++) {nums += counter.get(time - i).get();}log.info("time=" + time + ",nums=" + nums);if (nums > limit) {log.info("限流了,nums=" + nums);}} catch (Exception e) {log.error("slideWindow error", e);} finally {}}, 5000, 1000, TimeUnit.MILLISECONDS);}
}

输出结果:

20:14:50.083 [pool-1-thread-3] INFO com.example.demo.limit.WindowLimiter - time=1574079290,nums=15
20:14:51.114 [pool-1-thread-3] INFO com.example.demo.limit.WindowLimiter - time=1574079291,nums=13
20:14:52.119 [pool-1-thread-3] INFO com.example.demo.limit.WindowLimiter - time=1574079292,nums=14
20:14:53.121 [pool-1-thread-3] INFO com.example.demo.limit.WindowLimiter - time=1574079293,nums=15
20:14:54.126 [pool-1-thread-3] INFO com.example.demo.limit.WindowLimiter - time=1574079294,nums=17
20:14:54.127 [pool-1-thread-3] INFO com.example.demo.limit.WindowLimiter - 限流了,nums=17
20:14:55.128 [pool-1-thread-3] INFO com.example.demo.limit.WindowLimiter - time=1574079295,nums=14
20:14:56.131 [pool-1-thread-3] INFO com.example.demo.limit.WindowLimiter - time=1574079296,nums=17
20:14:56.132 [pool-1-thread-3] INFO com.example.demo.limit.WindowLimiter - 限流了,nums=17

限流算法:滑动时间窗口算法。相关推荐

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

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

  2. sentinel 滑动时间窗口算法

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

  3. 精度不够,滑动时间来凑「限流算法第二把法器:滑动时间窗口算法」- 第301篇

    相关历史文章(阅读本文之前,您可能需要先看下之前的系列

  4. Sentinel限流及其滑动窗口算法

    Sentinel限流及其滑动窗口算法 Sentinel的限流原理 滑动时间窗口算法 Sentinel的限流原理 限流效果,对应有DefaultController快速失败 WarmUpControll ...

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

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

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

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

  7. 什么是限流?为什么会限流呢?常见的限流算法【固定窗口限流、滑动窗口限流、漏桶限流、令牌桶限流】是什么呢?

    什么是限流?为什么会限流呢?常见的限流算法[固定窗口限流.滑动窗口限流.漏桶限流.令牌桶限流]是什么呢? 什么是限流? 为什么会限流? 1. 固定窗口限流算法 1.1 什么是固定窗口限流算法 1.2 ...

  8. 【限流算法】java实现固定时间窗口算法

    本文实现了一种基于java的固定时间窗口计数器算法 固定时间窗口计数器算法思想:在固定的时间窗口内,可以允许固定数量的请求进入.超过数量就拒绝或者排队,等下一个时间段进入. 优点:和令牌桶相比,这种算 ...

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

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

  10. JAVA实现滑动时间窗口

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

最新文章

  1. 单臂路由与三层交换机实现VLAN通信
  2. DL之RNN:循环神经网络RNN的简介、应用、经典案例之详细攻略
  3. C#TreeView控件
  4. 网络知识:WiFi越用越慢,到底是什么原因?
  5. iOS定时器-- NSTimer 和CADisplaylink
  6. oracle基本的操作命令,oracle命令基本操作
  7. python中scrapy的middleware是干嘛的_Python之爬虫(十九) Scrapy框架中Download Middleware用法...
  8. 一步一步教你使用Jmail实现邮件的接收与发送
  9. 企业软件是最难编写的软件
  10. k3 审核流程图_金蝶K3操作流程图详解(doc 64页)
  11. shell学习资料:shell十三问
  12. powerdesign 逆向工程
  13. 想学python网课哪个好过_求问一下jrs们,零基础学python哪个网课好?
  14. mzy对于反射的复习
  15. 计算机网络期末复习(学会不挂科)
  16. coap 返回版本信息_coap组包格式的简单解析
  17. Rockchip USB FFS Test Demo 使用说明
  18. 直击本质:聊聊小程序的前世今生
  19. Django基于admin的stark组件创建(一)
  20. 第三方支付平台结算流程是什么样的?

热门文章

  1. GeoTools操作shapefile
  2. 量子统计中的涨落和时间关联函数的概念(谐振子例子)
  3. WORD2016打印文档时,图片打印不正常的解决方法
  4. python求t分布值_简单数据分布分析与python实现,及
  5. 已知鸡兔共35只c语言,行测数量关系技巧:巧解鸡兔同笼问题
  6. C++ 中typedef用法
  7. java的handler机制_从源码解析Handler机制
  8. Android - 浅谈 Handler 机制
  9. HBase 数据库介绍
  10. 中国数字化城市行业现状调研及前景规划分析报告2022~2028年