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

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



相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
5月前
|
缓存 监控 NoSQL
【Azure Redis 缓存】Redis的监控方式? 是否有API接口调用来获取监控值
【Azure Redis 缓存】Redis的监控方式? 是否有API接口调用来获取监控值
|
NoSQL 算法 API
Redis实现API访问频率限制
Redis实现API访问频率限制
188 0
|
XML JSON 前端开发
软件测试|Spring Boot 的 RESTful API 设计与实现
软件测试|Spring Boot 的 RESTful API 设计与实现
软件测试|Spring Boot 的 RESTful API 设计与实现
|
NoSQL API Redis
利用Redis对含有分页参数的API接口做调用次数限制
利用Redis对含有分页参数的API接口做调用次数限制
194 0
|
缓存 移动开发 NoSQL
php结合redis实现高并发下的抢购、秒杀功能的实例
php结合redis实现高并发下的抢购、秒杀功能的实例
270 0
|
NoSQL Redis
Redis学习4:List数据类型、拓展操作、实现日志等
注意点:对存储空间的顺序进行分析!
Redis学习4:List数据类型、拓展操作、实现日志等
|
存储 NoSQL Redis
Redis学习3:hash类型操作、拓展操作、实现购物等
首先可以理解成一个redis里面有一个小的redis。同时要注意引入了一个field的名字。
Redis学习3:hash类型操作、拓展操作、实现购物等
|
SQL 安全 Java
微服务API开放授权平台的设计与实现
微服务API开放授权平台的设计与实现
516 0
微服务API开放授权平台的设计与实现
|
缓存 NoSQL 安全
2021年你还不会Shiro?----10.使用redis实现Shiro的缓存
上一篇文章已经总结了使用ehCache来实现Shiro的缓存管理,步骤也很简单,引入依赖后,直接开启Realm的缓存管理器即可。如果使用Redis来实现缓存管理其实也是一样的,我们也是需要引入redis的依赖,然后开启缓存传入自定义的redis的缓存管理器就行。区别是我们需要为自定义的redis缓存管理器提供自定义的缓存管理类。这个缓存管理类中需要使用到redisTemplate模板,这个模板我们也是需要自己定义。
290 0
|
NoSQL Java 关系型数据库
浅谈Redis实现分布式锁
浅谈Redis实现分布式锁