赞
踩
Redis 除了做缓存,还能干很多很多事情:分布式锁、限流、处理请求接口幂等性。。。太多太多了~今天想和小伙伴们聊聊用 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 中。
<Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。