icql

计数器算法

限流key,限流单位时间,限流数

实现思路:

string结构 key=限流key,value=请求计数,expired=限流单位时间

每次请求进来 判断value值 (1)超过限流数:限流 (2)未超过限流数:正常,value+1

问题:

请求不均匀时 可能 当前限流单位时间后1%的时间 和 下个限流单位时间的前%1的时间 请求量很大



滑动窗口算法

限流key,限流单位时间,限流数

实现思路:

zset结构 key=限流key,value=任意值,score=当前时间,expired=限流单位时间

每次请求进来 zcount 限流key 0 (当前时间+限流单位时间) zremrangebyscore 限流key (当前时间+限流单位时间) max (1)超过限流数:限流 (2)未超过限流数:正常,zadd 限流key 当前时间 任意值

问题:

限流数较大时,可能单个zset结构值太大 可以分散为多个zset去尽可能避免



令牌桶算法、漏桶算法

1)令牌桶算法

限流key,限流单位时间,限流数

实现思路: 往令牌桶里放令牌是一定速率均匀的 microservice_限流_令牌桶算法

2)漏桶算法

限流key,限流单位时间,限流数

实现思路: 令牌桶流出令牌是一定速率均匀的 microservice_限流_漏桶算法

3)比较

令牌桶算法:用来保护自己,对调用者频率进行限流 漏桶算法:用来保护他人,对调用其它系统进行限流