如何利用redis使用一个滑动窗口限流
介绍
滑动窗口限流就是,就是表示在一定时间之内,至多有多少请求能够进来,然后通过移动这个窗口来接收后续的请求。
Redis的实现方式
使用redis的zset的数据结构,
redis的key为 xx
score 为时间戳
Member 为请求详情
比如登录1分钟之内不能大于100
我们在登陆的时候,获取当前时间,
然后获取滑动窗口开始的时间,当前时间-60s
然后把小于开始时间的全部删除
之后获取当前请求的数量是否大于100
不大于则可以
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();//窗口开始时间是当前时间减60slong 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实现的限流
基于令牌桶实现的一个限流器