程序员之限流

一、固定窗口限流
实现方式:通过使用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使用了令牌桶

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容