redis实现网关限流(限制API调用次数1000次/分)
- 添加maven依赖,使用springboot2.x版本
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
- 添加redis配置进application.yml,springboot2.x版本的redis是使用lettuce配置的
spring:
redis:
database: 0
host: localhost
port: 6379
lettuce: # 这里标明使用lettuce配置
pool:
max-active: 8 # 连接池最大连接数
max-wait: -1ms # 连接池最大阻塞等待时间(使用负值表示没有限制
max-idle: 5 # 连接池中的最大空闲连接
min-idle: 0 # 连接池中的最小空闲连接
timeout: 10000ms # 连接超时时间
- 使用redis作限流器有两种写法
方法一:
Long size = redisTemplate.opsForList().size("apiRequest");
if (size < 1000) {
redisTemplate.opsForList().leftPush("apiRequest", System.currentTimeMillis());
} else {
Long start = (Long) redisTemplate.opsForList().index("apiRequest", -1);
if ((System.currentTimeMillis() - start) < 60000) {
throw new RuntimeException("超过限流阈值");
} else {
redisTemplate.opsForList().leftPush("apiRequest", System.currentTimeMillis());
redisTemplate.opsForList().trim("apiRequest", -1, -1);
}
}
核心思路:用一个list来存放一串值,每次请求都把当前时间放进,如果列表长度为1000,那么调用就是1000次。如果第1000次调用时的当前时间和最初的时间差小于60s,那么就是1分钟里调用超1000次。否则,就清空列表之前的值
方法二:
Integer count = (Integer) redisTemplate.opsForValue().get("apiKey");
Integer integer = Optional.ofNullable(count).orElse(0);
if (integer > 1000) {
throw new RuntimeException("超过限流阈值");
}
if (redisTemplate.getExpire("apiKey", TimeUnit.SECONDS).longValue() < 0) {
redisTemplate.multi();
redisTemplate.opsForValue().increment("apiKey", 1);
redisTemplate.expire("apiKey", 60, TimeUnit.SECONDS);
redisTemplate.exec();
} else {
redisTemplate.opsForValue().increment("apiKey", 1);
}
核心思路:设置key,过期时间为1分钟,其值是api这分钟内调用次数
对比:方法一耗内存,限流准确。方法二结果有部分误差,只限制key存在的这一分钟内调用次数低于1000次,不代表任意时间段的一分钟调用次数低于1000
redis实现网关限流(限制API调用次数1000次/分)的更多相关文章
- Spring Cloud Gateway 整合阿里 Sentinel网关限流实战!
大家好,我是不才陈某~ 这是<Spring Cloud 进阶>第八篇文章,往期文章如下: 五十五张图告诉你微服务的灵魂摆渡者Nacos究竟有多强? openFeign夺命连环9问,这谁受得 ...
- 限流(三)Redis + lua分布式限流
一.简介 1)分布式限流 如果是单实例项目,我们使用Guava这样的轻便又高性能的堆缓存来处理限流.但是当项目发展为多实例了以后呢?这时候我们就需要采用分布式限流的方式,分布式限流可以以redis + ...
- Spring Cloud Gateway 网关限流
Spring Cloud Gateway 限流 一.背景 二.实现功能 三.网关层限流 1.使用默认的redis来限流 1.引入jar包 2.编写配置文件 3.网关正常响应 4.网关限流响应 2.自定 ...
- 微服务架构spring cloud - gateway网关限流
1.算法 在高并发的应用中,限流是一个绕不开的话题.限流可以保障我们的 API 服务对所有用户的可用性,也可以防止网络攻击. 一般开发高并发系统常见的限流有:限制总并发数(比如数据库连接池.线程池). ...
- SpringCloud zuul 网关限流分析
最近项目中 spring cloud zuul 运用到限流功能,打算配置一下就直接使用,不过在压测与调优过程中遇到一些没有预测到的问题,附上排查与解析结果 yml.pom配置 强烈推荐,按最新gith ...
- Redis令牌桶限流
一 .场景描述 在开发接口服务器的过程中,为了防止客户端对于接口的滥用,保护服务器的资源, 通常来说我们会对于服务器上的各种接口进行调用次数的限制.比如对于某个 用户,他在一个时间段(interval ...
- 库存秒杀问题-redis解决方案- 接口限流
<?php/** * Created by PhpStorm. * redis 销量超卖秒杀解决方案 * redis 文档:http://doc.redisfans.com/ * ab -n 1 ...
- Redis+Lua实现限流
相比Redis事务来说,Lua脚本有以下优点减少网络开销: 不使用 Lua 的代码需要向 Redis 发送多次请求, 而脚本只需一次即可, 减少网络传输;原子操作: Redis 将整个脚本作为一个原子 ...
- 基于Redis实现分布式应用限流--转
原文地址:https://my.oschina.net/giegie/blog/1525931 摘要: 限流的目的是通过对并发访问/请求进行限速或者一个时间窗口内的的请求进行限速来保护系统,一旦达到限 ...
随机推荐
- cogs 80. 石子归并 动态规划
80. 石子归并 ★★ 输入文件:shizi.in 输出文件:shizi.out 简单对比时间限制:1 s 内存限制:128 MB 设有N堆沙(shi)子排成一排,其编号为1,2,3, ...
- python 07 数据类型
目录 1. 基础数据类型填充 1.str:(不可变) 2. list: 3. tuple: 4. dict: 5. set: 6. bool: 7. 数据类型之间转换 2.删除列表/字典的代码坑: 3 ...
- 【阿里云IoT+YF3300】5. Alink物模型之服务下发
名词解释: 服务:设备的功能模型之一,设备可被外部调用的能力或方法,可设置输入参数和输出参数.相比于属性,服务可通过一条指令实现更复杂的业务逻辑,如执行某项特定的任务. -摘自阿里云物联网产品文 ...
- Reactive(2) 响应式流与制奶厂业务
目录 再谈响应式 为什么Web后端开发的,对 Reactive 没有感觉 Java 9 支持的 Reactive Stream 范例 小结 扩展阅读 再谈响应式 在前一篇文章从Reactive编程到& ...
- luogu- P1373 小a和uim之大逃离 DP 四维,其中一维记录差值
P1373 小a和uim之大逃离: https://www.luogu.org/problemnew/show/P1373 题意: 在一个矩阵中,小A和小B轮流取数,小A可以从任意点先取,小B后取,最 ...
- codeforces 799 D. Field expansion(dfs+思维剪枝)
题目链接:http://codeforces.com/contest/799/problem/D 题意:给出h*w的矩阵,要求经过操作使得h*w的矩阵能够放下a*b的矩阵,操作为:将长或者宽*z[i] ...
- U盘便携式hexo&博客搭建&极速纯净低bug主题推荐&部署到coding&SEO优化搜索
指南:U盘便携式hexo&博客搭建&极速纯净低bug主题推荐&部署到coding&SEO优化搜索 U盘便携式hexo随处写博客 简述:在任意一台联网的电脑上续写he ...
- 关闭Linux(Ubuntu)错误报告
关于错误报告 网上查了下,Ubuntu(包括elementary,elementary是基于Ubuntu的)桌面版预装了Apport,它是一个错误收集系统,会收集软件崩溃.未处理异常和其他,包括程序b ...
- Oracle 11g Rac 用rman实现把本地数据文件迁移到ASM共享存储中
在Oracle Rac环境中,数据文件都是要存放在ASM共享存储上的,这样两个节点才能同时访问.而当你在某一节点下把数据文件创建在本地磁盘的时候,那么在另一节点上要访问该数据文件的时候就会报错,因为找 ...
- Django之使用内置函数和celery发邮件
邮箱配置 开启stmp服务 以163邮箱为例,点击设置里面的stmp 开启客户端授权密码 如上所示,因为我已经开启了,所以出现的是以上页面. 这样,邮箱的准备就已经完成了. 使用Django内置函数发 ...