public class SimpleRateLimiter {
private Jedis jedis;
public SimpleRateLimiter(Jedis jedis) {
this.jedis = jedis;
}
public boolean isActionAllowed(String userId, String actionKey, int period, int maxCount) {
String key = userId+"#"+actionKey;
long nowTs = System.currentTimeMillis();
Pipeline pipe = jedis.pipelined();
//开启事务
pipe.multi();
//第二个参数是score,第三个参数是value
pipe.zadd(key, nowTs, "" + nowTs);
//画图帮助理解
pipe.zremrangeByScore(key, 0, nowTs - period * 1000);
//当前窗口的元素个数
Response<Long> count = pipe.zcard(key);
//一定要设置过期时间,可能大部分用户是冷用户,因为要维护period时间内的记录,所以key过期时间要稍微比period大
pipe.expire(key, period + 1);
//执行事务
pipe.exec();
pipe.close();
return count.get() <= maxCount;
}
public static void main(String[] args) {
Jedis jedis = new Jedis();
SimpleRateLimiter limiter = new SimpleRateLimiter(jedis);
for (int i = 0; i < 20; i++) {
System.out.println(limiter.isActionAllowed("QYD", "reply", 60, 5));
}
}
}
限流算法-Redis实现滑动窗口限流算法
最新推荐文章于 2024-05-14 12:26:16 发布