Redis实现滑动窗口功能
redis实现滑动窗口
·
经常会遇到一些像X时间登陆y次,或者接口防刷这样的需求,redis可以提供很好的支持,只要是使用redis中zset结构的count(key, min,max)方法,若设置min为当前时间减去x,max取值为当前时间,就可以算出当前近x秒内,redis中存储了多少个这样的数据。
public String test() {
// time秒内只能访问接口co次
int time = 10;
int co = 3;
Long currentTime = new Date().getTime();
redisTemplate.hasKey("limit");
Integer count1 = null;
Long count = null;
if (redisTemplate.hasKey("limit")) {
// 方法一
// count1 = redisTemplate.opsForZSet().rangeByScore("limit", currentTime - time*1000, currentTime).size(); // intervalTime是限流的时间
// 方法二
count = redisTemplate.opsForZSet().count("limit", currentTime - time * 1000, currentTime);
if (count != null && count > co) {
return "error 超出次数";
}
}
redisTemplate.opsForZSet().add("limit", UUID.randomUUID().toString(),currentTime);
// 设置过期时间,时长为time的两倍
redisTemplate.expire("limit",time*2, TimeUnit.SECONDS);
return "ok";
}
更多推荐
已为社区贡献2条内容
所有评论(0)