基于spring boot 2.0.2利用redis实现多主机共享QPS工具类DEMO
网上有很多实现qps的方法,因为楼主的项目采用的是微服务架构,系统中要请求第三方接口,第三方对同一个key有qps限制,故楼主采用redis来实现多个服务的总请求qps限制。网上相关代码很多,但基本都经不住测试。故楼主将自己生产上使用的qps限制工具类贴出来,供大家参考学习。如有漏洞,希望大家及时指出。不胜感激!
public class QPS{
@Autowired
private StringRedisTemplate template;
public Object incr(String key){
if(template.opsForValue().setIfAbsent("qps","1")){
template.expire("qps",1,TimeUnit.SECONDS);
}
Long qps = template.opsForValue().increment("qps", 1);
//qps都是从2开始的,如果qps为1,说明该key是increment时新建的,不是set建的,所以没有指定过期时间,要重新指定过期时间
if (qps == 1){
template.expire("qps",1,TimeUnit.SECONDS);
}
if (qps > 1000){
try{
//如果qps超过阈值1000,则等待100ms重试。这块业务代码可以自己实现。
Thread.sleep(100);
incr(key);
}catch (InterruptedException e){
e.printStackTrace();
}
}
//到了这一步说明qps没有超限,可以添加自己的业务逻辑。
return template.opsForValue().get("qps");
}
}