一、计数限流
1.1 单机版示例
分布式可使用Redis incr和decr
优点:实现简单
缺点:释放流量是非原子性操作
1.2 单机版改进
在固定时间点清空计数器,以防止过多未释放的无效计数将容量填满
优点:实现简单,有效限制QPS
缺点:固定时间窗口无法应对突发流量,在重制计数的时间点,QPS会最大值可达到2倍
二、滑动窗口
Java伪代码(限制QPS<100)
优点:限流平滑
缺点:规模越大,耗费内存越多
三、漏桶算法
可使用Redis-cell模块实现
优点:强制限制平均速率
特点:应对突发流量时,超出容量会直接拒绝服务
四、令牌桶算法
特点:允许突发流量时,超出令牌个数可选阻塞或拒绝请求
JAVA伪代码