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 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; } }