使用原生RedisTemplate做一个接口频繁访问限制功能
可根据ip或者用户名来限制
假设功能要求是一个公用接口,一分钟只允许被同一个ip调用5次,那么及可根据该方法实现
代码
String ip = App.GetIP(request);
String redisKey = "limit-ip-request:" + key + ":" + ip;
if(! redisTemplate.hasKey(redisKey)){
redisTemplate.opsForValue().set(redisKey,1,60,TimeUnit.SECONDS);
}else{
int increment = ConverterUtils.toInt(redisTemplate.opsForValue().get(redisKey));
if(increment > 4){
return JsonData.buildError("请求过于频繁,请稍微再试!");
} else {
redisTemplate.opsForValue().set(redisKey, ++increment,60,TimeUnit.SECONDS);
}
}
解释:
公司有写好的工具类,通过request获取ip,根据ip自定义一个key,如果key不存在则添加这个key,value为1(此处value会被底层代码序列化为字符串结构,如果下面使用increment自增来判断次数则会报错)设置60秒超时时长.
如果key不存在,获取该key,并把value转成int类型,如果value大于4,则抛出异常,否则,value自增.
TimeUnit.DAYS //天
TimeUnit.HOURS //小时
TimeUnit.MINUTES //分钟
TimeUnit.SECONDS //秒
TimeUnit.MILLISECONDS //毫秒