首页 > 编程知识 正文

使用redis做api缓存,redis令牌桶限流实现

时间:2023-05-05 14:19:02 阅读:61714 作者:3949

漏斗法漏桶算法原理:漏桶有一定的容量,向漏桶注水,当单位时间注入的水量大于溢出水量时,漏桶内积水将持续增加,直至溢出。

要求大量接入nginx相当于注水,nginx根据配置以一定速度将要求作为排水处理。

水桶的容量类似于分配给nginx的队列长度。 如果发生水桶泄漏,则禁止请求进入,并直接返回错误

php实现简单的料斗算法/** * [leaky php实现漏桶算法] * @param [type] $contain [int桶的总容量] * @ param [ type ] $ AAP s,3/s] * @param integer $water [int当前水量] * @param integer $preTime [int时间戳,记录的上次漏水时间] * @ return [ type ] [ bb true/false ] */function leaky ($ contain、$addNum、$leakRate、$water=0、$preTime=0) ) /参数赋值//首次默认的当前//首次进入默认值上次漏水时间是当前时间$pretime=empty($water )? 时间(: $ pretime; $curTime=time (; //从上次结束到这次开始,流出的水$ leak water=$ curtime-$ pretime (* $ leak rate; //从上次结束时的水量中减去流出的水,这次的初始水量$water=$water-$leakWater; //水量不会为负,大于漏出时水量为0$water=() $water=0)? $water : 0; //更新这次漏水时间$preTime=$curTime; //如果水小于总容量,则可以注入,否则if($water$addnum )=$contain ) { $water =$addNum; 返回真; }else{ return false; } } /** *测试*@varinteger*/for($I=0; $i500; $i ) $ RES=leaky (50,1,5,$water,$timeStamp ); var_dump($RES; usleep(50000; } redis的料斗算法包括公共函数速度计数器(() $redis=new(redis ); $redis-connect((127.0.0.1 ),6379 ); //最大请求数$maxCount=100; //每分钟,一个用户只能访问10次$interval=60; //请求总数$zcount=$redis-incr('ZCont ); //最大值if(zcount=$maxcount ) /业务处理) user=[ 11,21,31,41,51,61 ]; foreach($useras$val ) ) {$key=$val; $check=$redis-exists($key ); if($check ) $sum=$redis-Incr ) $key ); (if ) $sum )//业务处理echo )每个用户在规定的时间内只能访问$sum )五次。 } else {echo '你已经$sum '; }else{//print_r($redis-get ) $key ); 请购买echo '; $sum=$redis-Incr($key ); $redis-expire($key,$interval ); }}} else {//请求数$redis-expire('ZCont ',$interval ); 超过echo '要求的'.$zcount; )漏桶算法桶大小恒定,处理速度恒定,但要求的速度不恒定。 如果是突发的,就会放弃很多请求。 /** * **泄漏桶的大小一定,处理速度也一定,但要求的速度不一定。 如果是突发的,就会放弃很多请求。 * */functionleackbucket (($ redis=new (redis ); $redis-connect((127.0.0.1 ),6379 ); //桶容量$maxCount=1000; //小时$间隔=10; //1分钟内流出的数量$speed=20; //用户$time=$redis-time (; $key=$time[0].$time[1]; //时间判断//$redis-del('outcount ); $check=$redis-exists('outcount ); //echo $check; if($check )//从桶中发出的费率请求数(outcount=$redis-incr ) )、outcount ); ((if ) $outCount=$speed ) ) /业务处理echo ) )在规定的时间内只能访问$outcount ) 20次。 } else {echo '你每分钟访问$outCount '; } else { $ out count=$ redis-incr (' out count ); //echo $outCount; $redis-expire('outcount ',$interval ); echo '时间过去了'; 退出; }令牌桶

令牌算法(Token Bucket )具有与Leaky Bucket相同的效果,但是是反方向的算法,更容易理解。 随着时间的推移,系统以一定的1/QPS间隔(如果QPS=100,则间隔为10ms )向水桶中加入Token ) )与脆弱性的漏水相反,可以想象水龙头在不断加水)。

令牌桶的另一个优点是可以很容易地改变速度。 如果需要提高速度,根据需要提高放入桶中的令牌的速度。 通常,您会在计时器(例如100毫秒)中将一定数量的令牌添加到桶中,但某些变种算法会计算应实时添加的令牌数量。

/** *令牌*/function TrafficShaper () $redis=new(redis ); $redis-pconnect('127.0.0.1 ',6379 ); //桶容量$maxCount=10; //当前容量$ curnum=$ maxcount-$ redis-get (' token ' )-1; echo $curnum; if($curnum0) (/业务逻辑) /成功后) $token=$redis-incr ) ' token ); echo '===$token '; (else ) echo (没有令牌); $redis-set('Token ',0 ); }} redis基于lua漏斗算法对api的电流限制https://mp.weixin.qq.com/s/r3Tpq6EIXZt_djbSEiH8Ew

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。