sac/sf-vertx/src/main/java/com/sf/vertx/handle/RedisRateLimiter.java
2024-04-26 15:30:30 +08:00

54 lines
1.8 KiB
Java

package com.sf.vertx.handle;
import java.util.concurrent.TimeUnit;
import org.springframework.data.redis.core.RedisTemplate;
import com.sf.vertx.api.pojo.AppCurrentLimitingConfig;
import com.sf.vertx.constans.RedisKeyConfig;
import com.sf.vertx.init.DynamicBuildServer;
import com.sf.vertx.service.impl.AppConfigServiceImpl;
import com.sf.vertx.utils.SpringUtils;
import io.vertx.ext.web.RoutingContext;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class RedisRateLimiter {
public Boolean acquire(RoutingContext rc, int pattern) {
String appCode = rc.request().headers().get(DynamicBuildServer.SAC_APP_HEADER_KEY);
//TODO 先测试app模式,后面通过app缓存获取模式
switch (pattern) {
case 1:
String key = RedisKeyConfig.APP_CURRENT_LIMITING_CONFIG_KEY +":"+ appCode;
return rateLimiter(key, appCode);
default:
break;
}
return false;
}
@SuppressWarnings("unchecked")
private Boolean rateLimiter(String key, String appCode) {
RedisTemplate<String, Integer> redisTemplate = SpringUtils.getBean("redisTemplate", RedisTemplate.class);
AppCurrentLimitingConfig appCurrentLimitingConfig = AppConfigServiceImpl.getAppCurrentLimitingConfig(appCode);
Object count = redisTemplate.opsForValue().get(key);
//redisTemplate.delete(key);
log.info("count:{}", count);
if(count == null) {
// 初始化,设置过期时间
redisTemplate.opsForValue().increment(key);
log.info("redis app threshold: {}", redisTemplate.opsForValue().get(key));
redisTemplate.expire(key, appCurrentLimitingConfig.getTimeWindow(), TimeUnit.SECONDS);
} else if(Integer.valueOf(count.toString()) < appCurrentLimitingConfig.getThreshold()) {
redisTemplate.opsForValue().increment(key);
} else {
return false;
}
return true;
}
}