4月更文d27n27-redis实现漏桶限流

142 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第27天,点击查看活动详情

redis实现漏桶限流

前文

漏桶算法是高并发限流中的一种常用算法。所谓漏桶算法,大致可以理解为一个桶,桶底有一个栋。水可以以任意速率流入桶中,而流出的速率会完全保持恒定,类似于很常见的一种水池问题。而漏桶算法的限流主要是会起到对于下流系统的保护,放置下流系统承受过高的瞬间流量。下面结合redis具体来记录一下该限流方法的运用。

利用redis实现漏桶算法

漏桶算法,故名思意我们需要一个桶。而当利用redis实现具体的限流时,redis也就会充当这个桶的角色,具体来说我们会采用list这种数据结构进行漏桶算法的实现。由于当实际的使用时存在并发问题,因此按常理来说应该在lua脚本中实现对应的一系列操作,或是加锁来处理并发,这部分文中先暂时忽略。

来看一下具体的使用流程。首先当请求到达服务时,首先需要查看桶中是否仍然含有空位。如果此时桶中内容已满,则选择直接放弃该请求。反之如果桶中此时还有剩余空间,则直接将请求放入漏桶中。再来看另一端,根据我们需要的消费速率,需要设置一个定时任务,每间隔对应时间进行桶中数据的定量消费,例如每秒消费10条数据,同时将桶中数据移除。这样也就成为了一个完成的请求处理流程。

image.png

如上图所示,可以理解为漏桶限流的具体过程。

与之前谈到过的令牌桶算法先比较,很明显令牌桶主要是在请求端进行限定,输出端并未进行处理。而相对而言,漏桶算法则主要是针对数据流的输出处理速率恒定进行展开。引申一下,令牌桶能够完成对于瞬时大流量的处理,且系统的压力主要限定上流系统对本系统的调用。而漏桶算法则主要是保护了下游的系统,保证下游系统接收到请求的速率为恒定,且无法在瞬时完成突发大流量的请求处理。