使用SpringBoot + Redis 实现接口限流的方式

作者:MrDong先生 时间:2023-07-11 00:06:49 

Redis 除了做缓存,还能干很多很多事情:分布式锁、限流、处理请求接口幂等性。。。太多太多了

配置

首先我们创建一个 Spring Boot 工程,引入 Web 和 Redis 依赖,同时考虑到接口限流一般是通过注解来标记,而注解是通过 AOP 来解析的,所以我们还需要加上 AOP 的依赖,最终的依赖如下:

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

然后提前准备好一个 Redis 实例,这里我们项目配置好之后,直接配置一下 Redis 的基本信息即可,如下:

spring.redis.host=localhost
spring.redis.port=6379
spring.redis.password=123

限流注解

接下来我们创建一个限流注解,我们将限流分为两种情况:

  • 针对当前接口的全局性限流,例如该接口可以在 1 分钟内访问 100 次。

  • 针对某一个 IP 地址的限流,例如某个 IP 地址可以在 1 分钟内访问 100 次。

针对这两种情况,我们创建一个枚举类:

public enum LimitType {
   /**
    * 默认策略全局限流
    */
   DEFAULT,
   /**
    * 根据请求者IP进行限流
    */
   IP
}

接下来我们来创建限流注解:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RateLimiter {
   /**
    * 限流key
    */
   String key() default "rate_limit:";

/**
    * 限流时间,单位秒
    */
   int time() default 60;

/**
    * 限流次数
    */
   int count() default 100;

/**
    * 限流类型
    */
   LimitType limitType() default LimitType.DEFAULT;
}

第一个参数限流的 key,这个仅仅是一个前缀,将来完整的 key 是这个前缀再加上接口方法的完整路径,共同组成限流 key,这个 key 将被存入到 Redis 中。

另外三个参数好理解,我就不多说了。

来源:https://juejin.cn/post/7102244886165848077

标签:SpringBoot,Redis,接口限流
0
投稿

猜你喜欢

  • 如何优化网站图片以快速显示

    2008-04-05 10:09:00
  • win10安装Sql Server 2014图文教程

    2024-01-16 16:47:34
  • Python设计模式编程中解释器模式的简单程序示例分享

    2023-01-16 08:44:29
  • pyqt5实现俄罗斯方块游戏

    2023-07-21 11:02:32
  • 讲解MaxDB数据库和MySQL的数据库的主要差别

    2012-02-25 20:04:34
  • 关于 MediaPlayer 播放器参数详解

    2008-08-10 18:33:00
  • 微信小程序利用Canvas绘制图片和竖排文字详解

    2023-08-20 02:35:43
  • python for循环remove同一个list过程解析

    2023-03-20 22:07:48
  • Mysql数据库表定期备份的实现详解

    2024-01-24 11:24:35
  • pygame实现俄罗斯方块游戏(AI篇2)

    2022-03-02 13:03:10
  • Python 实现数组相减示例

    2021-08-19 07:01:52
  • SQL Data Services将成为云中完整的数据库

    2009-03-25 12:28:00
  • 轻松掌握python设计模式之访问者模式

    2023-06-30 13:46:39
  • JS原生轮播图的简单实现(推荐)

    2024-04-29 14:06:30
  • 终于搞懂了Python中super(XXXX, self).__init__()的作用了

    2022-01-04 00:35:44
  • Python转json时出现中文乱码的问题及解决

    2021-11-29 17:02:16
  • 在IE下获取object(ActiveX)的Param

    2009-05-15 13:07:00
  • Go内存节省技巧简单实现方法

    2024-04-27 15:25:05
  • 改善登陆界面的用户体验: 自动聚焦表单

    2009-12-09 16:13:00
  • python 判断linux进程,并杀死进程的实现方法

    2022-06-24 22:31:54
  • asp之家 网络编程 m.aspxhome.com