解决问题对象: 并发流量
解决方案:
1、计数器:
2、滑动窗口计数器:redis,zset数据结构,权重score存时间戳,使用rangeByscore查询指定时间段内的
3、漏桶:
4、令牌桶:
刚才去查了一些资料 好像redis基本都直接提供了 或者说结构可以实现 这几个限流
简单计数器:hash 存timestamp 和 count,每次进去在距离timestamp不足指定时差timeLimit时,判断count是否大于countLimit,大于阻止访问,否则累加count;超过timeLimit时,重置timestamp 和 count窗口计数器:zset value和score都存timestamp,每次请求先移除窗口期timeLimit之前的记录,对窗口期内的记录总数count与countLimit做比较,如果超出了,阻止访问
漏桶:Redis 4.0 提供了一个限流 Redis 模块,名称为 redis-cell,该模块提供漏斗算法,并提供原子的限流指令 这个稍微有点不好理解,我要再看看令牌桶:list当做桶,length当做令牌数,或者初始化一个普通key-value,value存令牌数,如果length和value <= 0 则阻止访问,否则pop或decr 另开一个常驻任务 按固定速率push或者incr length或value=令牌上限则停止加牌,用while+sleep来完成这个加牌过程
漏桶:视用户的请求为水,发起请求是向桶内注水,处理请求是出水。这个过程跟令牌桶相反。
令牌桶是初始化为满桶令牌,漏桶是初始化为空桶水
令牌桶【资格】是空桶则阻止请求,漏桶【负载】是满桶阻止请求
令牌桶的加桶速率是 每 1/qps 秒+1,取牌速率跟请求同步; 漏桶的出水速率是qps,注水速率跟请求同步
令牌桶另开任务加牌(加资格),漏桶另开任务出水(消化请求)
这里好奇初始化桶的容量该是多少 QPS? QPS = 并发量/平均响应时长
答案:并发量
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。