本文实现了一种基于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

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

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

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

  2. sentinel 滑动时间窗口算法

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

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

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

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

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

  5. JAVA实现滑动时间窗口

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

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

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

  7. Redis(六)——限流算法:滑动时间窗口限流和漏斗限流

    本文主要总结自<redis深度历险> 限流的意义 限流一般是指在一个时间窗口内对某些操作请求的数量进行限制,比如一个论坛限制用户每秒钟只能发一个帖子,每秒钟只能回复5个帖子.限流可以保证系 ...

  8. linux tcp限流脚本,TCP通过滑动窗口和拥塞窗口实现限流,能抵御ddos攻击吗

    tcp可以通过滑动窗口和拥塞算法实现流量控制,限制上行和下行的流量,但是却不能抵御ddos攻击. 限流只是限制访问流量的大小,是无法区分正常流量和异常攻击流量的. 限流可以控制本软件或者应用的流量大小 ...

  9. 限流的4种策略--固定窗口、滑动窗口、漏桶、令牌桶

    01 Why 分布式系统中,由于接口API无法控制上游调用方的行为,因此当瞬时请求量突增时,会导致服务器占用过多资源,发生响应速度降低.超时.乃至宕机,甚至引发雪崩造成整个系统不可用. 限流,Rate ...

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

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

最新文章

  1. CSS面试复习(三):预处理器、工程化方案、三大框架中的CSS
  2. 算法--------打家劫舍(动态规划,Java版本)
  3. zcmu2012(积性函数---因子和)
  4. 【Python】学习笔记总结3(Python文件操作)
  5. mysql字段重命名_MySQL中使用SQL语句对字段进行重命名
  6. 翻领成型器轨迹点MATLAB编程,基于MATLAB的翻领成型器领口曲线的展开及可视化
  7. mysql 数据库中根据当前系统时间,取前后几秒 几分钟 几小时 几天
  8. java 是怎么在中删除下拉列表_java中下拉菜单如何清空
  9. 使用异或解题 —— 序列中仅出现一次的两个数
  10. jquery如何判断元素是否被点击_百度知道
  11. 个人隐私保护2:用BitLocker创建一块需要密码才能进入的区域
  12. 进行 HTML、JavaScript 和 Ajax 开发和调试的必用工具
  13. SAP的系统审计以及SM19的使用
  14. 专用集成电路 -- 运算电路 (加法器,乘法器,移位器)
  15. 关于“为什么delete以后指针还能被赋值”一种描述
  16. Openstack API 开发 快速入门
  17. c# 实现语音播报功能 转发
  18. [软件测试]怎么测试一个杯子
  19. 万字拆解自嗨锅:造价近百万的直播间,是单场直播GMV破100万的法门吗?
  20. CSS——伪类选择器

热门文章

  1. 新老更替选本难 最新CPU显卡参数解析
  2. 《那些年啊,那些事——一个程序员的奋斗史》三
  3. 关于编程, 游戏, 学习, 人生和奥特曼的感想(持续更新)
  4. IT大学生成长周报 | 第 2 期
  5. Python视觉深度学习系列教程 第三卷 第11章 车辆识别
  6. NetSetMan v5.0.5特别版
  7. 学习编程必备常用英语单词
  8. 最小生成树的实现(C语言)
  9. MeshLab源码阅读笔记
  10. oracle导入dmp报20000,imp导入dmp文件报:IMP-00038: 无法转换为环境字符集句柄IMP-00000: 未成功终止导入...