一、固定窗口限流
实现方式:通过使用redis的incrementAndGet的原子操作实现,例如要想实现100tps的限流。
当系统第一次请求的时候,初始化key的值为1,并设置redis的Key的超时时间为1秒,每次请求使用incrementAndGet方式加1,时间过期之后会迭代到下一个窗口。
优点:简单的实现分布式的限流,
缺点:在窗口开始的0.0 ~ 0.1时间内,请求了100次访问也不会限流(实际这时候的tps已经达到了1000tps),而0.1~1.0这段时间的请求无论几次都会被限流。
二、滑动窗口算法:
类似于TCP中的流量控制算法,可以通过redis的ZSet实现,ZSet中保留窗口内的每次请求时间戳,
Sentinel 基于滑动窗口的限流
三、漏桶算法:
主要通过记录上级访问的时间和当前时间的差值,计算一次访问的TPS。
四、令牌桶算法:
Redission的Lua脚本实现,比如Guava的RateLimiter使用了令牌桶