程序员之限流
2023-08-02 本文已影响0人
zhglance
一、限流的几种实现方式:
1.固定窗口限流
实现方式:通过使用redis的incrementAndGet的原子操作实现,例如要想实现100tps的限流。
当系统第一次请求的时候,初始化key的值为1,并设置redis的Key的超时时间为1秒,每次请求使用incrementAndGet方式加1,时间过期之后会迭代到下一个窗口。
优点:简单的实现分布式的限流,
缺点:在窗口开始的0.00.1时间内,请求了100次访问也不会限流(实际这时候的tps已经达到了1000tps),而0.11.0这段时间的请求无论几次都会被限流。
二、滑动窗口算法:
类似于TCP中的流量控制算法,可以通过redis的ZSet实现,ZSet中保留窗口内的每次请求时间戳,
Sentinel 基于滑动窗口的限流
三、漏桶算法:
类似线程池的实现。
四、令牌桶算法:
Redission的Lua脚本实现,比如Guava的RateLimiter使用了令牌桶