常见的限流算法,以及实现思路(着重讲解滑动窗口限流)

常见的限流算法

1、漏桶算法:系统请求先进入漏桶,再从漏桶中逐一取出请求执行,控制漏桶的流量
2、令牌桶算法:系统请求会得到一个令牌,从令牌桶中取出一个令牌执行,控制令牌桶中令牌的数量
3、计数器算法:系统请求被计数,通过比较当前请求与限流阈值来判断是否限流
4、可以阻塞算法:当系统达到限流阈值时,不再接受请求,等到限流阈值降下来之后再接受请求
5、令牌环算法:与令牌桶算法类似,但是在多个令牌桶之间形成环形结构,以便于在不同的请求处理速率之间进行平衡
6、最小延迟算法:基于预测每个请求的处理时间,并在处理完请求后进行延迟,以控制请求的速率。
7、滑动窗口限流:基于一个和固定大小的时间窗口,允许在该时间窗口内的请求数不超过设定的阈值,这个时间窗口随着时间的推移不断滑动,以适应不同时间段内的请求流量

着重理解一下滑动窗口限流

滑动窗口限流是一种流量控制策略,用于控制在一定时间内允许执行的操作数量或请求频率。它的工作方式类似于一个滑动时间窗口,在窗口内允许的操作数量是固定的,窗口会随着时间的推移不断滑动。
在这里插入图片描述
首先需要把时间划分成多个连续的时间片段,每一个片段都有一个固定的时间间隔,如1s、1h等。

然后再定义一个时间窗口,比如10s,随着时间的推移,这个窗口不断的向右移动。为了实现限流的功能,我们通常需要定义一个计数器,统计时间窗口内的请求数。

当时间窗口移动时,需要把上一个时间片段中的请求数减掉,当有新的请求或操作到达系统时,系统会检查窗口内的计数是否已满。如果计数未满,请求被允许执行;如果计数已满,请求被拒绝或进入等待队列,或执行其他限流操作。

滑动窗口限流的主要优点是可以在时间内平滑地控制流量,而不是简单地设置固定的请求数或速率。这使得系统可以更灵活地应对突发流量或峰值流量,而不会因为固定速率的限制而浪费资源或降低系统性能。

滑动窗口限流可以在分布式系统、API服务、网络通信等各种应用场景中使用,以确保系统的稳定性和可用性,防止过多的请求或操作对系统造成负担或崩溃。

使用Redis实现滑动窗口限流

利用Redis,我们就可以实现一个简单的滑动窗口限流的功能。因为滑动窗口和时间有关,所以很容易能想到要基于时间进行统计。

那么我们只需要在每一次有请求进来的时候,记录下请求的时间戳和请求的数据,然后在统计窗口内请求的数量时,只需要统计窗口内的被记录的数据量有多少条就行了。

在Redis中,我们可以基于ZSET来实现这个功能。假如我们限定login接口一分钟只能调用100次:

那么,我们就可以把login接口这个需要做限流的资源名作为key在redis中进行存储,然后value我们现在ZSET这种数据结构,把他的score设置为当前请求的时间戳,member的话建议用请求的详情的hash进行存储(或者UUID、MD5什么的),避免在并发时,时间戳一致出现score和member一样导致被zadd幂等的问题。
在这里插入图片描述
所以,我们实现滑动窗口限流的主要思想是:只保留在特定时间窗口内的请求记录,而丢弃窗口之外的记录。
主要步骤如下:

  1. 定义滑动窗口的时间范围,例如,窗口大小为60秒。
  2. 每次收到一个请求时,我们就定义出一个zset然后存储到redis中。
  3. 然后再通过ZREMRANGEBYSCORE命令来删除分值小于窗口起始时间戳(当前时间戳-60s)的数据。
  4. 最后,再使用ZCARD命令来获取有序集合中的成员数量,即在窗口内的请求量
	import redis.clients.jedis.Jedis;
	public class slidingwindowRateLimiter {
   
    	private Jedis jedis;
		private string key;private int limit;
		public boolean allowRequest(string key){
   
       	 	//当前时间戳
			long currentTime =System.currentTimeMillis();
			//窗口开始时间是当前时间减60s
			long windowstart 
  • 16
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

江南_烟雨.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值