介绍
滑动窗口限流就是,就是表示在一定时间之内,至多有多少请求能够进来,然后通过移动这个窗口来接收后续的请求。
Redis的实现方式
使用redis的zset的数据结构,
redis的key为 xx
score 为时间戳
Member 为请求详情

比如登录1分钟之内不能大于100
我们在登陆的时候,获取当前时间,
然后获取滑动窗口开始的时间,当前时间-60s
然后把小于开始时间的全部删除
之后获取当前请求的数量是否大于100
不大于则可以
java
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 = currentTime - 60 * 1000;
//删除窗口开始时间之前的所有数据
jedis.zremrangeByScore(key, "-inf", String.valueOf(windowStart));
//计算总请求数
long currentRequests = jedis.zcard(key);
//窗口足够则把当前请求加入
if (currentRequests < limit) {
jedis.zadd(key, currentTime, String.valueOf(currentTime));
return true;
}
return false;
}
}
ZREMRANGEBYSCORE
这个命令可以删除 一个区间的数据,
ZREMRANGEBYSCORE key min max
Redisson实现的限流
基于令牌桶实现的一个限流器