解决问题对象: 并发流量
解决方案:
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 = 并发量 / 均匀响应时长
答案:并发量