Redis 实现接口访问频率限制
为什么限制访问频率
做服务接口时通常需要用到请求频率限制 Rate limiting,例如限制一个用户1分钟内最多可以范围100次
主要用来保证服务性能和保护数据安全
因为如果不进行限制,服务调用者可以随意访问,想调几次就调几次,会给服务造成很大的压力,降低性能,再比如有的接口需要验证调用者身份,如果不进行访问限制,调用者可以进行暴力尝试
使用 Redis 来实现
通过 Redis 可以方便的实现频率限制功能,下面介绍两种不错的方法
(1)方案1 - Lua脚本
思路
把限制逻辑封装到一个Lua脚本中,调用时只需传入:key、限制数量、过期时间,调用结果就会指明是否运行访问
代码如下:
local notexists = redis.call(\"set\", KEYS[1], 1, \"NX\", \"EX\", tonumber(ARGV[2])) if (notexists) thenreturn 1 end local current = tonumber(redis.call(\"get\", KEYS[1])) if (current == nil) thenlocal result = redis.call(\"incr\", KEYS[1])redis.call(\"expire\", KEYS[1], tonumber(ARGV[2]))return result end if (current >= tonumber(ARGV[1])) thenerror(\"too many requests\") end local result = redis.call(\"incr\", KEYS[1]) return result
使用 eval 调用
eval 脚本 1 key 参数-允许的最大次数 参数-过期时间
(2)方案2 - 扩展模块
Redis4 中开放了模块系统,大家可以开发自己的模块插入到 redis 中,redis 官方已经推荐了一个访问限制模块 redis-cell,只需要一条命令就可以实现需求
示例
CL.THROTTLE user123 15 30 60
- user123 是 key
- 15 是最大配额数量
- 30 是可以访问次数
- 60 是时间周期,单位秒
综合起来的意思是,user123 的最大资源配额是15,60秒内最多可以访问30次
返回结果:
1) (integer) 0 # 0 允许; 1 拒绝 2) (integer) 16 # 总配额 3) (integer) 15 # 剩余配额 4) (integer) -1 # 几秒后可以重试,-1 表示不限制,第一条为0时,此处为-1 5) (integer) 2 # 几秒后恢复最大值
每次执行这个命令时,剩余配额都会减1,当配额不足,或者访问次数超限时,都会被拒绝
项目地址
https://github.com/antirez/neural-redis
小结
频率限制的实现有多种方式,例如,Nginx 和 Haproxy 都有限制模块、Java 中可以用 Guava,通过Redis来实现也是很常见的方式
目前方案1代表了主流用法,例如大型的云服务商Heroku、在线支付Stripe都在使用 Redis+Lua脚本的这个方案
方案2基于 Redis4 的模块系统,现在还不太适用,但当 Redis4 成为稳定版本后,就可以愉快的使用了
转载于:https://www.cnblogs.com/duhuo/p/5002319.html
Redis 实现接口访问频率限制相关推荐
- Spring mvc通过访问者IP限制接口访问频率
我们有的时候系统里面有的用户接口为了控制访问频率,需要使用到,笔记走一波 环境: spring spring mvc Guava:谷歌高并发工具,下面是maven <!--谷歌guava高并发处 ...
- .NET接口访问频率限制——MvcThrottle
1.首先搜索安装MvcThrottle. 2.引用空间 using MvcThrottle; 3.在FilterConfig里边添加方法: public class FilterConfig{publ ...
- Redis应用之限制访问频率
我们知道当网站的访问量突然很大的时候肯定会对服务器造成影响,甚至无法访问,如果是正常的访问那么很好说明业务量增大可以考虑系统的扩展,但是如果是搜索引擎爬虫频繁访问或是一些恶意访问,那这时候我们就应 ...
- 接口限流:限制接口的访问频率
限流,顾名思义,就是限制对 API 的调用频率.每一次 API 调用,都要花费服务器的资源,因此很多 API 不会对用户无限次地开放,请求达到某个次数后就不再允许访问了,或者一段时间内,最多只允许访问 ...
- php限制接口访问次数_令牌桶限流思路分享(PHP+Redis实现机制)
一 .场景描述 在开发接口服务器的过程中,为了防止客户端对于接口的滥用,保护服务器的资源, 通常来说我们会对于服务器上的各种接口进行调用次数的限制.比如对于某个 用户,他在一个时间段(interval ...
- Nginx+Lua脚本+Redis 实现自动封禁访问频率过高IP
前言:由于公司前几天短信接口被一直攻击,并且攻击者不停变换IP,导致阿里云短信平台上的短信被恶意刷取了几千条,然后在Nginx上对短信接口做了一些限制 临时解决方案: 1.查看Nginx日志发现被攻击 ...
- nginx lua redis 访问频率限制(转)
1. 需求分析 Nginx来处理访问控制的方法有多种,实现的效果也有多种,访问IP段,访问内容限制,访问频率限制等. 用Nginx+Lua+Redis来做访问限制主要是考虑到高并发环境下快速访问控制的 ...
- Spring自定义注解+redis实现接口限流
在实际开发中,有时候我们需要对某些接口进行限流,防止有人恶意攻击或者是因为某些接口自身的原因,比如发短信接口,IO处理的接口. 这里我们通过自定义一个注解,并利用Spring的AOP拦截器功能来实现限 ...
- 【小工具】滑动时间窗统计单位时间内访问频率
起因 想要完成一个个人轻量级微服务框架,负载均衡和接口安全都需要一个这样的工具来统计访问频率,那么就选择了一种比较传统的方式来实现,其他博客中有提供一些方式,但设计较为简单,不能满足我的需求,所以再起 ...
最新文章
- struts2学习笔记(二):Struts2配置
- React as a UI Runtime(四、条件)
- pytorch中的pre-train函数模型引用及修改(增减网络层,修改某层参数等)
- GridView空记录时显示Header和Footer
- 160 - 24 Chafe.2
- Web.Config文件配置之数据库连接配置
- 95-280-035-源码-资源管理-计算资源管理-TaskSlot
- 贺利坚老师汇编课程32笔记:处理字符串——大小写转换通过与和或运算加减20H
- javascript变量说明
- golang语言中的关于err的函数封装事项的函数使用
- 微信退款读取resource下的证书(apiclient_cert.p12)获取不到问题
- unity 录屏插件总结 以及 AVProMovieCapture 5.0.0 安卓录制失败问题
- 纯css绘制简易对话气泡
- 算法——弗洛伊德算法(Floyd-Warshall)(图论)(c++)
- 【UOJ #390】【UNR #3】百鸽笼(指数型生成函数,二项式定理)
- Github标签管理
- 差分隐私(Differential Privacy)定义及其理解
- (附源码)ssm医务志愿者管理系统 毕业设计 100910
- python爬虫第二弹-多线程爬取网站歌曲
- 2022氯化工艺特种作业证考试题库及答案
热门文章
- 根据选择计算Mask值
- 钟南山:疫情1周或10天左右达到高峰,不会大规模增加了!
- CVPR19 Oral 如何避免高置信度的错误预测?
- 【OpenCV】OpenCV函数精讲之 -- 通道合并:merge()函数
- 超强领先!Transformer图像复原效果显著!
- 论文绘图神器来了:哈佛博士后开源一行代码绘制不同期刊格式图表
- mysql5.7.18压缩包下载_MySQL 5.7.18 解压版安装
- 有趣的应用 | 使用RNN预测股票价格系列一
- pythonnumpy函数四舍五入_NumPy函数
- python删除数据库_用Python删除Cosmos数据库文档