滑动窗口限流 java_Java应用限流

本文介绍了在高并发系统中使用限流作为保护手段的重要性,并详细讲解了滑动窗口限流算法,包括其原理和Java实现。通过Redis实现滑动窗口限流,确保请求速率平稳,防止请求暴增对系统造成冲击。
摘要由CSDN通过智能技术生成

在开发高并发系统时,有三把利器用来保护系统:缓存、降级和限流:

缓存:缓存的目的是提升系统访问速度和增大系统处理容量

降级:降级是当服务出现问题或者影响到核心流程时,需要暂时屏蔽掉,待高峰或者问题解决后再打开

限流:限流的目的是通过对并发访问/请求进行限速,或者对一个时间窗口内的请求进行限速来保护系统,一旦达到限制速率则可以拒绝服务、排队或等待、降级等处理

常见算法:

1、计时器限流

2、滑动窗口

3、漏桶算法

4、令牌桶算法

计时器限流

计时器是限流算法中比较简单的一种算法,比如:限制一个接口1分钟内不能超过100次请求,可以在一开始设置一个计数器,每当接收到请求时,将计数器加1,如果计数器的值大于100并且当前请求与第一个请求的执行时间间隔还在1分钟内的,那就说明请求过多;如果当前请求与第一次请求的时间间隔超过1分钟,并且请求次数没有超限的,那么重置计数器

import org.springframework.data.redis.core.RedisTemplate;

/**

* 计数器限流

* 限制1分钟内请求100次

* 弊端:

* 1、当前窗口100个请求全部集中到结束点,下个窗口100个请求全部集中到起始点,临界点就会出现请求暴增的情况,可能瞬间压垮应用

* 2、只适用于单机应用,分布式环境中无法满足

*

* @author lile

* @date 2019/7/1618:59

*/

public class CounterLimit {

//时间窗口内的最大请求数

public final int reqCount = 100;

//时间窗口内的当前请求数

private int currentReqCount;

//时间窗口的长度 单位:ms

public final int interval = 60 * 1000;

//当前时间

public Long currentTimestamp = System.currentTimeMillis();

public RedisTemplate redisTemplate;

public final String key = "minute_test";

/**

* 计数器限流

*

* @return

*/

public boolean grant() {

Long nowTimestamp = System.currentTimeMillis();

if (nowTimestamp < currentTimestamp + interval) {

//在当前时间窗口内

currentReqCount++;

//判断当前时间窗口的请求数是否小于最大的请求限制数

return currentReqCount < reqCount;

}

//不在当前窗口内时,重置下个窗口的首次请求时间及窗口内请求数

currentReqCount = 1;

currentTimestamp = nowTimestamp;

return true;

}

/**

* 滑动窗口的限流

* 保证时间窗口中的请求数不超过最大限制数即可,能平稳的控制请求的速率,请求过快会被拒绝

* 窗口时间范围定为1分钟,每次接收到请求后重新划分时间窗口,当前时间往前的1分钟范围为新的时间窗口

*

* @return

*/

public boolean DuoJiQi() {

Long nowTimestamp = System.currentTimeMillis();

if (redisTemplate.opsForZSet().size(key) > 0) {

//移除不在当前时间窗口的数据

redisTemplate.opsForZSet().removeRangeByScore(key, 0, nowTimestamp - interval);

}

redisTemplate.opsForZSet().add(key, "当前请求的唯一ID", nowTimestamp);

if (redisTemplate.opsForZSet().size(key) > reqCount) {

//请求超限,禁止提交请求

return false;

}

return true;

}

}

滑动窗口

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
掌握数据结构和算法,可称为算法工程师!这是成为架构师的基础,有Google算法大神亲授。我保证你可以写出时空复杂度都很优的架构。有人专门答疑哟!你想要成为架构工程师吗?立即点击报名按钮吧!北上广容不下肉身,三四线放不下灵魂,程序员里没有穷人,有一种土豪叫 算法工程师。程序 = 数据结构 + 算法程序是为了解决实际问题而存在的。然而为了解决问题,必定会使用到某些数据结构以及设计一个解决这种数据结构的算法。如果说各种编程语言是程序员的招式,那么数据结构和算法就相当于程序员的内功。编程实战算法,不是念PPT,我们讲的就是实战与代码实现与企业应用。程序 = 数据结构 + 算法           ——图灵奖得主,计算机科学家N.Wirth(沃斯)作为程序员,我们做机器学习也好,做python开发也好,java开发也好。有一种对所有程序员无一例外的刚需 —— 算法与数据结构日常增删改查 + 粘贴复制 + 搜索引擎可以实现很多东西。同样,这样也是没有任何竞争力的。我们只可以粘贴复制相似度极高的功能,稍复杂的逻辑没有任何办法。语言有很多,开发框架更是日新月异3个月不学就落后我们可以学习很多语言,很多框架,但招聘不会考你用5种语言10种框架实现同一个功能。真正让程序员有区分度,企业招聘万年不变的重点 —— 算法与数据结构。算法代表程序员水平的珠穆朗玛。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值