经常会遇到一些像X时间登陆y次,或者接口防刷这样的需求,redis可以提供很好的支持,只要是使用redis中zset结构的count(key, min,max)方法,若设置min为当前时间减去x,max取值为当前时间,就可以算出当前近x秒内,redis中存储了多少个这样的数据。
public String test() {
int time = 10;
int co = 3;
Long currentTime = new Date().getTime();
redisTemplate.hasKey("limit");
Integer count1 = null;
Long count = null;
if (redisTemplate.hasKey("limit")) {
count = redisTemplate.opsForZSet().count("limit", currentTime - time * 1000, currentTime);
if (count != null && count > co) {
return "error 超出次数";
}
}
redisTemplate.opsForZSet().add("limit", UUID.randomUUID().toString(),currentTime);
redisTemplate.expire("limit",time*2, TimeUnit.SECONDS);
return "ok";
}