做二手车有哪些网站有哪些手续,翠竹林wordpress主题,ui设计最常用的软件,泰州模板建站源码1. 基于Redis的zset数据结构实现滑动窗口限流
我们可以将请求打造成一个zset数组#xff0c;当每一次请求进来的时候#xff0c;value保持唯一#xff0c;可以用UUID生成#xff0c;而score可以用当前时间戳表示#xff0c;因为score我们可以用来计算当前时间戳之内有多少…1. 基于Redis的zset数据结构实现滑动窗口限流
我们可以将请求打造成一个zset数组当每一次请求进来的时候value保持唯一可以用UUID生成而score可以用当前时间戳表示因为score我们可以用来计算当前时间戳之内有多少的请求数量。而zset数据结构也提供了range方法让我们可以很轻易的获取到2个时间戳内有多少请求。
public Response limitFlow(){Long currentTime new Date().getTime();System.out.println(currentTime);if(redisTemplate.hasKey(limit)) {Integer count redisTemplate.opsForZSet().rangeByScore(limit, currentTime - intervalTime, currentTime).size(); // intervalTime是限流的时间 System.out.println(count);if (count ! null count 5) {return Response.ok(每分钟最多只能访问5次);}}redisTemplate.opsForZSet().add(limit,UUID.randomUUID().toString(),currentTime);return Response.ok(访问成功);
}通过上述代码可以做到滑动窗口的效果并且能保证每N秒内至多M个请求缺点就是zset的数据结构会越来越大。实现方式相对也是比较简单的。
3. 基于Redis的list数据结构实现令牌桶限流
令牌桶算法提及到输入速率和输出速率当输出速率大于输入速率那么就是超出流量限制了。 我们每访问一次请求的时候可以从Redis中获取一个令牌如果拿到令牌了那就说明没超出限制而如果拿不到则结果相反。
// 定时放令牌
// 10S的速率往令牌桶中添加UUID只为保证唯一性
Scheduled(fixedDelay 10_000,initialDelay 0)
public void setIntervalTimeTask(){redisTemplate.opsForList().rightPush(limit_list,UUID.randomUUID().toString());
}// 取令牌
public Response limitFlow2(Long id){Object result redisTemplate.opsForList().leftPop(limit_list);if(result null){return Response.ok(当前令牌桶中无令牌);}return Response.ok(articleDescription2);
}