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

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 通过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,由调用方进行具体处理。



目录
相关文章
|
缓存 监控 NoSQL
【Azure Redis 缓存】Redis的监控方式? 是否有API接口调用来获取监控值
【Azure Redis 缓存】Redis的监控方式? 是否有API接口调用来获取监控值
107 0
|
NoSQL 算法 API
Redis实现API访问频率限制
Redis实现API访问频率限制
274 0
|
XML JSON 前端开发
软件测试|Spring Boot 的 RESTful API 设计与实现
软件测试|Spring Boot 的 RESTful API 设计与实现
软件测试|Spring Boot 的 RESTful API 设计与实现
|
NoSQL API Redis
利用Redis对含有分页参数的API接口做调用次数限制
利用Redis对含有分页参数的API接口做调用次数限制
254 0
利用Redis对含有分页参数的API接口做调用次数限制
|
缓存 移动开发 NoSQL
php结合redis实现高并发下的抢购、秒杀功能的实例
php结合redis实现高并发下的抢购、秒杀功能的实例
379 0
|
NoSQL Redis
Redis学习4:List数据类型、拓展操作、实现日志等
注意点:对存储空间的顺序进行分析!
Redis学习4:List数据类型、拓展操作、实现日志等
|
存储 NoSQL Redis
Redis学习3:hash类型操作、拓展操作、实现购物等
首先可以理解成一个redis里面有一个小的redis。同时要注意引入了一个field的名字。
Redis学习3:hash类型操作、拓展操作、实现购物等
|
SQL 安全 Java
微服务API开放授权平台的设计与实现
微服务API开放授权平台的设计与实现
665 0
微服务API开放授权平台的设计与实现
|
缓存 NoSQL 安全
2021年你还不会Shiro?----10.使用redis实现Shiro的缓存
上一篇文章已经总结了使用ehCache来实现Shiro的缓存管理,步骤也很简单,引入依赖后,直接开启Realm的缓存管理器即可。如果使用Redis来实现缓存管理其实也是一样的,我们也是需要引入redis的依赖,然后开启缓存传入自定义的redis的缓存管理器就行。区别是我们需要为自定义的redis缓存管理器提供自定义的缓存管理类。这个缓存管理类中需要使用到redisTemplate模板,这个模板我们也是需要自己定义。
364 0
2021年你还不会Shiro?----10.使用redis实现Shiro的缓存
|
NoSQL Java 关系型数据库
浅谈Redis实现分布式锁
浅谈Redis实现分布式锁

热门文章

最新文章