一 算法
滑动窗口算法弥补了计数器算法的不足。滑动窗口算法把间隔时间划分成更小的粒度,当更小粒度的时间间隔过去后,把过去的间隔请求数减掉,再补充一个空的时间间隔。
如下图所示,把1分钟划分为10个更小的时间间隔,每6s为一个间隔。
1 一个时间窗口为1分钟,滑动窗口分成10个格子,每个格子6秒。
2 每过6秒,滑动窗口向右移动1个格子。
3 每个格子都有独立的计数器。
4 如果时间窗口内所有的计数器之和超过了限流阀值,则触发限流操作。
如下图所示,滑动窗口算法比计数器算法控制得更精细。
用户在0:59 时刻发送了100个请求,第10个格子的计数器增加100,下一秒的时候时间窗口向右移动1格,这时再来100个请求就超过了阈值,不会处理这100个请求,这样就避免了计数器场景出现的问题。
滑动窗口设置得越精细,限流的效果越好,但滑动窗口的时间间隔(小格子)多了,存储的空间也会增加。
二 需求
1 设计一个滑动窗口,窗口有10个格子,每个格子10秒,每隔10秒移动一格。
2 装满所有格子的时间为 10 * 10 = 100 秒。也就是说时