分布式限流-滑动窗口实现

Updated on with 0 views and 1 comments

选择

限流算法大体有两种:

1.计数式

计数算法有固定窗口算法与滑动窗口算法两种。
固定窗口临界不易处理。例如:

窗口为一分钟限流30
第一分钟,前30秒流量为0,后30秒流量为25
第二分钟,前30秒流量为25,后30秒流量为0

固定窗口对于这两分钟流量都没触发限流操作。

滑动窗口则会统计每一个窗口期内的流量。
例如:

窗口为一分钟限流30
第一分钟,前30秒流量为0,后30秒流量为25
第二分钟,前30秒流量为25,后30秒流量为0

滑动窗口会统计第一分钟后30秒与第二分钟前30秒的流量
在窗口期流量为50,则触发流量限制

所以对于滑动窗口可以很好的处理临界问题

2.桶算法

桶算法分为漏桶算法与令牌桶算法。
桶算法主动往桶里添加token,。

对于我们业务场景,通常情况下桶的数量(key)不易于确定,所以我们采用计数式滑动窗口算法。

实现

以时间区间为窗口

基于redis的ZADD实现

ZADD key score member

ZCOUNT ZCOUNT key min max

主要依赖ZADD与ZCOUNT命令

ZADD中的score使用时间戳(可以秒也可以毫秒)

再通过ZCOUNT统计score区间来统计流量进行限制操作

总结

使用redis实现算法,无须再自己实现算法。同时可以实现分布式。easy!


标题:分布式限流-滑动窗口实现
作者:xiongxiaochao
地址:http://solo.fancydigital.com.cn/articles/2021/04/28/1619582632007.html