基于|基于 Redis 的速率限制算法
在Rate Limiting with Redis这篇文章中,作者介绍了一个十分惊艳的速率限制算法,该算法基于 Redis 实现,能够支持多个限制条件。
【基于|基于 Redis 的速率限制算法】先看看原作者在工作中对速率限制的需求:
- 严格的速率限制,避免时间边界(time boundary)问题
- 支持多个限制条件
- 支持手动阻塞
- 分布式,多个系统可以并发使用
上述情况也引出了对多个速率限制条件的需求。举例来说,不仅仅希望每分钟限制20个请求,还希望每秒不超过1个请求,每30秒不超过15个请求等等。
那么原作者是如何利用 Redis 来解决上面的需求呢?原作者使用 Redis 的 list 数据类型来按序记录每次请求的时刻。
举例说明下算法的逻辑。假设前五次请求的时刻如下表所示:
文章图片
并且,有两个速率限制条件:每秒1个和每分钟5个。
- 如果接下来的请求时刻小于12:34:29,由于它与12:34:28的时间间隔不超过1秒并且在这1秒内已经有了1次请求,所以触犯了每秒1个这个限制条件
- 如果接下来的请求时刻小于12:34:35,由于它与12:33:35的时间间隔不超过1分钟并且在这1分钟内已经有了5次请求,所以触犯了每分钟5个这个限制条件
- 如果接下来的请求时刻是12:34:40,那么与最近一次请求相比时间已经过了12秒,与五次前的请求相比时间已经过了65秒,于是通过了这两个速率限制
文章图片
如果想进一步的理解该算法,可以参考原作者速率限制的Python实现。
推荐阅读
- 用POA清晰亲子问题中的方向
- 趁着年末,约上老友来一场旅行吧!目的地我们都帮你选好了!
- jquery的height()和javascript的height总结,js获取屏幕高度
- 投稿|能源变革的下一步,为什么一定是太阳能?
- java|程序员网吧写代码挨顿打(网友(想笑死我继承我的花呗?))
- 学计算机的能看出批图吗,P过的图片能看出来吗(给你4个鉴别方法!)
- 计算机主机突然断电有什么影响吗,断电对电脑的伤害大吗(有什么损伤?)
- linux|linux 的文件权限案列
- 城市|7图告诉你,中国哪些城市的通勤最不友好
- 医疗|毛利率超茅台,风口下的实验小鼠能飞多久?