首頁 >後端開發 >php教程 >php 基於redis使用令牌桶演算法實現流量控制

php 基於redis使用令牌桶演算法實現流量控制

jacklove
jacklove原創
2018-06-15 17:22:533806瀏覽

本文介紹php基於redis,使用令牌桶演算法,實現存取流量的控制,提供完整演算法說明及示範實例,方便大家學習使用。
每當國內長假期或重要節日時,國內的景區或地鐵都會人山人海,導致負載過大,部分則會採用限流措施,限制進入的人數,當區內人數降低到一定值,再允許進入。

例如:
區內最大允許人數為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); }?>

模擬消耗程式如下,每秒消耗2-8個令牌。

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

因令牌桶一開始是滿的(最大令牌數10),所以之前的10次都能取得到令牌,10次之後則會根據消耗的令牌大於加入令牌數時,限制存取。
本文講解了php 基於redis使用令牌桶演算法實現流量控制 ,更多相關內容請關注php中文網。

相關推薦:

Redis主從同步,讀寫分離設定的相關操作

#介紹mysql重建表分割區並保留資料的方法

PHP產生唯一RequestID類別的相關內容

以上是php 基於redis使用令牌桶演算法實現流量控制的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn