为什么限制访问频率

做服务接口时通常需要用到请求频率限制 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 实现接口访问频率限制相关推荐

  1. Spring mvc通过访问者IP限制接口访问频率

    我们有的时候系统里面有的用户接口为了控制访问频率,需要使用到,笔记走一波 环境: spring spring mvc Guava:谷歌高并发工具,下面是maven <!--谷歌guava高并发处 ...

  2. .NET接口访问频率限制——MvcThrottle

    1.首先搜索安装MvcThrottle. 2.引用空间 using MvcThrottle; 3.在FilterConfig里边添加方法: public class FilterConfig{publ ...

  3. Redis应用之限制访问频率

      我们知道当网站的访问量突然很大的时候肯定会对服务器造成影响,甚至无法访问,如果是正常的访问那么很好说明业务量增大可以考虑系统的扩展,但是如果是搜索引擎爬虫频繁访问或是一些恶意访问,那这时候我们就应 ...

  4. 接口限流:限制接口的访问频率

    限流,顾名思义,就是限制对 API 的调用频率.每一次 API 调用,都要花费服务器的资源,因此很多 API 不会对用户无限次地开放,请求达到某个次数后就不再允许访问了,或者一段时间内,最多只允许访问 ...

  5. php限制接口访问次数_令牌桶限流思路分享(PHP+Redis实现机制)

    一 .场景描述 在开发接口服务器的过程中,为了防止客户端对于接口的滥用,保护服务器的资源, 通常来说我们会对于服务器上的各种接口进行调用次数的限制.比如对于某个 用户,他在一个时间段(interval ...

  6. Nginx+Lua脚本+Redis 实现自动封禁访问频率过高IP

    前言:由于公司前几天短信接口被一直攻击,并且攻击者不停变换IP,导致阿里云短信平台上的短信被恶意刷取了几千条,然后在Nginx上对短信接口做了一些限制 临时解决方案: 1.查看Nginx日志发现被攻击 ...

  7. nginx lua redis 访问频率限制(转)

    1. 需求分析 Nginx来处理访问控制的方法有多种,实现的效果也有多种,访问IP段,访问内容限制,访问频率限制等. 用Nginx+Lua+Redis来做访问限制主要是考虑到高并发环境下快速访问控制的 ...

  8. Spring自定义注解+redis实现接口限流

    在实际开发中,有时候我们需要对某些接口进行限流,防止有人恶意攻击或者是因为某些接口自身的原因,比如发短信接口,IO处理的接口. 这里我们通过自定义一个注解,并利用Spring的AOP拦截器功能来实现限 ...

  9. 【小工具】滑动时间窗统计单位时间内访问频率

    起因 想要完成一个个人轻量级微服务框架,负载均衡和接口安全都需要一个这样的工具来统计访问频率,那么就选择了一种比较传统的方式来实现,其他博客中有提供一些方式,但设计较为简单,不能满足我的需求,所以再起 ...

最新文章

  1. struts2学习笔记(二):Struts2配置
  2. React as a UI Runtime(四、条件)
  3. pytorch中的pre-train函数模型引用及修改(增减网络层,修改某层参数等)
  4. GridView空记录时显示Header和Footer
  5. 160 - 24 Chafe.2
  6. Web.Config文件配置之数据库连接配置
  7. 95-280-035-源码-资源管理-计算资源管理-TaskSlot
  8. 贺利坚老师汇编课程32笔记:处理字符串——大小写转换通过与和或运算加减20H
  9. javascript变量说明
  10. golang语言中的关于err的函数封装事项的函数使用
  11. 微信退款读取resource下的证书(apiclient_cert.p12)获取不到问题
  12. unity 录屏插件总结 以及 AVProMovieCapture 5.0.0 安卓录制失败问题
  13. 纯css绘制简易对话气泡
  14. 算法——弗洛伊德算法(Floyd-Warshall)(图论)(c++)
  15. 【UOJ #390】【UNR #3】百鸽笼(指数型生成函数,二项式定理)
  16. Github标签管理
  17. 差分隐私(Differential Privacy)定义及其理解
  18. (附源码)ssm医务志愿者管理系统 毕业设计 100910
  19. python爬虫第二弹-多线程爬取网站歌曲
  20. 2022氯化工艺特种作业证考试题库及答案

热门文章

  1. 根据选择计算Mask值
  2. 钟南山:疫情1周或10天左右达到高峰,不会大规模增加了!
  3. CVPR19 Oral 如何避免高置信度的错误预测?
  4. 【OpenCV】OpenCV函数精讲之 -- 通道合并:merge()函数
  5. 超强领先!Transformer图像复原效果显著!
  6. 论文绘图神器来了:哈佛博士后开源一行代码绘制不同期刊格式图表
  7. mysql5.7.18压缩包下载_MySQL 5.7.18 解压版安装
  8. 有趣的应用 | 使用RNN预测股票价格系列一
  9. pythonnumpy函数四舍五入_NumPy函数
  10. python删除数据库_用Python删除Cosmos数据库文档