这种计数方式比较简单快捷,但是有很大的缺点,因为请求的访问不一定是很平稳的,如果0:59过来了1000个请求,1:01已经是下一个窗口,又过来了1000个请求,但实际上三秒内来了2000个请求,已经超过我们的限流上限了。所以这种方法是不推荐的。
滑动窗口算法还拿上面的例子,一分钟分6份,每份10秒;每过10秒钟,我们的时间窗口就会往右滑动一格,每个格子都有独立的计数器,我们每次都计算时间窗口内的数量,可以解决计数器法中的问题,而且当滑动窗口的格子越多,那么限流的统计就会越精确。具体可以参考下图,看图比较清晰
伪代码实现如下
这段代码还是略显复杂,需要读者花一定的时间好好啃。它的整体思路就是:每一个行为到来时,都维护一次时间窗口。将时间窗口外的记录全部清理掉,只保留窗口内的记录。
因为这几个连续的 Redis 操作都是针对同一个 key 的,使用 pipeline 可以显著提升Redis 存取效率。「但这种方案也有缺点,因为它要记录时间窗口内所有的行为记录,如果这个量很大,比如限定 60s 内操作不得超过 100w 次这样的参数,它是不适合做这样的限流的,因为会消耗大量的存储空间」。
后面还有漏桶算法和令牌桶算法,由于各自的实现比较复杂,所以准备各自新开一篇文章单独描述
到此这篇关于redis限流的实际应用的文章就介绍到这了,更多相关redis限流内容请搜索七叶笔记以前的文章或继续浏览下面的相关文章希望大家以后多多支持七叶笔记!