1.固定窗口
public String testFixedWindow() {
String now = formatter.format(LocalDateTime.now());
Long count = redisTemplate.opsForValue().increment(now + ":fixed");
if (count > 5) {
return "不好意思,服务器正忙,请一分钟后再试......";
} else {
return "服务端正在处理";
}
该方式优点是比较简单粗暴,缺点是不够灵活,对于边界问题不能够处理,如设置的时间段刚开始时流量占满了设置的最大次数,后面一段时间则不能够再进行访问,必须等该时间段过了后才可以再次访问。
2.滑动窗口
通过上述代码可以做到滑动窗口的效果,并且能保证每N秒内至多M个请求,
缺点就是
1.zset的数据结构会越来越大。实现方式相对也是比较简单的。
2.每个请求都需要重新统计最新时间窗口内的请求数,性能较低。
3.令牌桶
RRateLimiter rateLimiter = redisson.getRateLimiter(“myRateLimiter”);
// 最大流速 = 每10秒钟产生1个令牌
rateLimiter.trySetRate(RateType.OVERALL, 1, 10, RateIntervalUnit.SECONDS);
//需要1个令牌
if (rateLimiter.tryAcquire(1)) {
return "令牌桶里面有可使用的令牌";
}
return "不好意思,请过十秒钟再来~~~~~~~";