乐趣区

关于限流:限流

解决问题对象: 并发流量

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

答案:并发量 
退出移动版