@Slf4j
@Service
public class LimitCheckService {
@Autowired
private RedisTemplate<String, String> redisTemplate;
public boolean checkRateLimitForMinute(String limitKey, String limitPrefix, long limitCount, int time, TimeUnit timeUnit) {
Date now = new Date();
String minute = DateUtil.format(now, "yyyyMMddHHmm");
int qpmCount = incrementAndGet(String.format("qpm_%s_%s_%s", limitPrefix, limitKey, minute), time, timeUnit);
if (qpmCount > limitCount) {
log.error("checkRateLimitForMinute limit error, limitKey:{}, limitPrefix:{}, limitCount:{},time:{}, timeUnit:{}", limitKey, limitPrefix, limitCount, time, timeUnit);
return false;
}
return true;
}
public int incrementAndGet(String key, int time, TimeUnit timeUnit) {
Long count = redisTemplate.opsForValue().increment(key);
if (count == null) {
count = 1L;
}
if (count == 1) {
redisTemplate.expire(key, time, timeUnit);
}
return count.intValue();
}
public int get(String key) {
String value = redisTemplate.opsForValue().get(key);
return value == null ? 0 : Integer.parseInt(value);
}
}