本文介紹php基於redis,使用令牌桶演算法,實現存取流量的控制,提供完整演算法說明及示範實例,方便大家學習使用。
每當國內長假期或重要節日時,國內的景區或地鐵都會人山人海,導致負載過大,部分則會採用限流措施,限制進入的人數,當區內人數降低到一定值,再允許進入。
例如: 模擬消耗程式如下,每秒消耗2-8個令牌。 示範 設定定時任務,每分鐘執行一次 執行模擬消耗 執行結果: 因令牌桶一開始是滿的(最大令牌數10),所以之前的10次都能取得到令牌,10次之後則會根據消耗的令牌大於加入令牌數時,限制存取。 相關推薦:
區內最大允許人數為M
區內目前人數為N
每進入一個人,N 1,當N = M時,則不允許進入
每離開一個人,N-1,當 N ea578da568e27d108b3ed9cf31f3bd84 'localhost', 'port' => 6379, 'index' => 0, 'auth' => '', 'timeout' => 1, 'reserved' => NULL, 'retry_interval' => 100,
);// 令牌桶容器$queue = 'mycontainer';// 最大令牌数$max = 10;// 每次时间间隔加入的令牌数$token_num = 3;// 时间间隔,最好是能被60整除的数,保证覆盖每一分钟内所有的时间$time_step = 1;// 执行次数$exec_num = (int)(60/$time_step);// 创建TrafficShaper对象$oTrafficShaper = new TrafficShaper($config, $queue, $max);for($i=0; $iac5d8bbec8fb1aae84ade36d7c132775add($token_num); echo '['.date('Y-m-d H:i:s').'] add token num:'.$add_num.PHP_EOL;
sleep($time_step);
}?>b0aa8dbae4af6175c5b1872dc35aed72 'localhost', 'port' => 6379, 'index' => 0, 'auth' => '', 'timeout' => 1, 'reserved' => NULL, 'retry_interval' => 100,
);// 令牌桶容器$queue = 'mycontainer';// 最大令牌数$max = 10;// 每次时间间隔随机消耗的令牌数量范围$consume_token_range = array(2, 8);// 时间间隔$time_step = 1;// 创建TrafficShaper对象$oTrafficShaper = new TrafficShaper($config, $queue, $max);// 重设令牌桶,填满令牌$oTrafficShaper->reset();// 执行令牌消耗while(true){ $consume_num = mt_rand($consume_token_range[0], $consume_token_range[1]); for($i=0; $idd4e44fbcd7068196de2d6c8cad7e133get(); echo '['.date('Y-m-d H:i:s').'] consume token:'.($status? 'true' : 'false').PHP_EOL;
}
sleep($time_step);
}?>
* * * * * php /程序的路径/cron_add.php >> /tmp/cron_add.log
php consume_demo.php
[2018-02-23 11:42:57] consume token:true[2018-02-23 11:42:57] consume token:true[2018-02-23 11:42:57] consume token:true[2018-02-23 11:42:57] consume token:true[2018-02-23 11:42:57] consume token:true[2018-02-23 11:42:57] consume token:true[2018-02-23 11:42:57] consume token:true[2018-02-23 11:42:58] consume token:true[2018-02-23 11:42:58] consume token:true[2018-02-23 11:42:58] consume token:true[2018-02-23 11:42:58] consume token:true[2018-02-23 11:42:58] consume token:true[2018-02-23 11:42:58] consume token:true[2018-02-23 11:42:58] consume token:false[2018-02-23 11:42:59] consume token:true[2018-02-23 11:42:59] consume token:true[2018-02-23 11:42:59] consume token:true[2018-02-23 11:42:59] consume token:false[2018-02-23 11:42:59] consume token:false[2018-02-23 11:42:59] consume token:false[2018-02-23 11:42:59] consume token:false[2018-02-23 11:43:00] consume token:true[2018-02-23 11:43:00] consume token:true[2018-02-23 11:43:00] consume token:true[2018-02-23 11:43:00] consume token:false[2018-02-23 11:43:00] consume token:false
本文講解了php 基於redis使用令牌桶演算法實現流量控制 ,更多相關內容請關注php中文網。
以上是php 基於redis使用令牌桶演算法實現流量控制的詳細內容。更多資訊請關注PHP中文網其他相關文章!