接口限流通用类

@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);
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值