通过REDIS实现限制API调用次数

在对外提供api接口时,往往需要对api接口进行限制,某些情况下还需要做好防止接口被刷的功能。利用redis的自增计数特性可以很轻易的实现该功能。

关于Spring boot等项目集成redis就不再多说,这里提供一种场景下redis的使用:在指定时间段检查api对应方法被调用的次数,如果超出该限制则返回true,触发规则,其他情况返回false。

项目基于springboot,首先定义对应的阈值配置:

close:
  # 封号时间区间,默认1,单位秒
  seconds: 1
  # api调用次数,默认3次,达到3次则封号。
  times: 3

定义了1秒钟,被调用3次,则触发规则。

该配置文件在对应的类中进行注入:

@Value("${close.seconds}")
private int closeSeconds;
@Value("${close.times}")
private int closeTimes;

然后注入redisTemplate和定义redis的key前缀。

public static final String CLOSE_LIMIT_PRE = "close_limit_pre_";
@Resource
private RedisTemplate<String, Object> redisTemplate;

下面便是校验的核心工具方法:

/**
   * 统计单位时间内,请求次数
   *
   * @param userId 用户ID
   * @param method 方法
   * @return
   */
  protected boolean isClose(Long userId, String method) {
    
    
    String key = CLOSE_LIMIT_PRE + userId + "_" + method;
    Long count = redisTemplate.opsForValue().increment(key, 1);
    if(count == 1){
    
    
      redisTemplate.expire(key, closeSeconds, TimeUnit.SECONDS);
      return false;
    } else if(count >= closeTimes){
    
    
      return true;
    } else {
    
    
      return false;
    }
  }

通过用户id和方法名称参数拼接key,当然根据你的具体场景可以进行变通。

通过increment来初始化或对值加1,如果redis中不存在该值,则对该key的值初始化为1,如果存在则进行加1并返回值。当未初始化时,调用返回count值为1,此时设置失效时间。其他情况则比较次数是否超过限制,如果超过则返回true,由调用方进行具体处理。

原文链接:《通过REDIS实现限制API调用次数

精品SpringBoot 2.x视频教程

《Spring Boot 2.x 视频教程全家桶》,精品Spring Boot 2.x视频教程,打造一套最全的Spring Boot 2.x视频教程。

扫描二维码关注公众号,回复: 11675434 查看本文章

程序新视界

公众号“ 程序新视界”,一个让你软实力、硬技术同步提升的平台

微信公众号:程序新视界

猜你喜欢

转载自blog.csdn.net/wo541075754/article/details/107148931