亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁(yè) > 學(xué)院 > 邏輯算法 > 正文

php 基于redis使用令牌桶算法實(shí)現(xiàn)流量控制

2020-03-22 18:58:26
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
本文介紹php基于redis,使用令牌桶算法,實(shí)現(xiàn)訪問(wèn)流量的控制,提供完整算法說(shuō)明及演示實(shí)例,方便大家學(xué)習(xí)使用。
每當(dāng)國(guó)內(nèi)長(zhǎng)假期或重要節(jié)日時(shí),國(guó)內(nèi)的景區(qū)或地鐵都會(huì)人山人海,導(dǎo)致負(fù)載過(guò)大,部分則會(huì)采用限流措施,限制進(jìn)入的人數(shù),當(dāng)區(qū)內(nèi)人數(shù)降低到一定值,再允許進(jìn)入。

例如:
區(qū)內(nèi)最大允許人數(shù)為 M
區(qū)內(nèi)當(dāng)前人數(shù)為 N
每進(jìn)入一個(gè)人,N+1,當(dāng)N = M時(shí),則不允許進(jìn)入
每離開(kāi)一個(gè)人,N-1,當(dāng)N < M時(shí),可允許進(jìn)入
系統(tǒng)在運(yùn)行過(guò)程中,如遇上某些活動(dòng),訪問(wèn)的人數(shù)會(huì)在一瞬間內(nèi)爆增,導(dǎo)致服務(wù)器瞬間壓力飆升,使系統(tǒng)超負(fù)荷工作。

當(dāng)然我們可以增加服務(wù)器去分擔(dān)壓力,首先增加服務(wù)器也需要一定的時(shí)間去配置,而且因?yàn)槟骋粋€(gè)活動(dòng)而增加服務(wù)器,活動(dòng)結(jié)束后這些服務(wù)器資源就浪費(fèi)了。

因此我們可以根據(jù)業(yè)務(wù)類型,先使用限流的方式去減輕服務(wù)器壓力。

與景區(qū)限流不同,系統(tǒng)的訪問(wèn)到結(jié)束的時(shí)間非常短,因此我們只需要知道每個(gè)訪問(wèn)持續(xù)的平均時(shí)間,設(shè)定最多同時(shí)訪問(wèn)的人數(shù)即可。

令牌桶算法

1.首先設(shè)有一個(gè)令牌桶,桶內(nèi)存放令牌,一開(kāi)始令牌桶內(nèi)的令牌是滿的(桶內(nèi)令牌的數(shù)量可根據(jù)服務(wù)器情況設(shè)定)。

2.每次訪問(wèn)從桶內(nèi)取走一個(gè)令牌,當(dāng)桶內(nèi)令牌為0,則不允許再訪問(wèn)。

3.每隔一段時(shí)間,再放入令牌,最多使桶內(nèi)令牌滿額。(可以根據(jù)實(shí)際情況,每隔一段時(shí)間放入若干個(gè)令牌,或直接補(bǔ)滿令牌桶)

我們可以使用redis的隊(duì)列作為令牌桶容器使用,使用lPush(入隊(duì)),rPop(出隊(duì)),實(shí)現(xiàn)令牌加入與消耗的操作。

TrafficShaper.html' target='_blank'>class.php

<?php/** * PHP基于Redis使用令牌桶算法實(shí)現(xiàn)流量控制 * Date:    2018-02-23 * Author:  fdipzone * Version: 1.0 * * Descripton: * php基于Redis使用令牌桶算法實(shí)現(xiàn)流量控制,使用redis的隊(duì)列作為令牌桶容器,入隊(duì)(lPush)出隊(duì)(rPop)作為令牌的加入與消耗操作。 * * Func: * public  add     加入令牌 * public  get     獲取令牌 * public  reset   重設(shè)令牌桶 * private connect 創(chuàng)建redis連接 */class TrafficShaper{ // class start    private $_config; // redis設(shè)定    private $_redis;  // redis對(duì)象    private $_queue;  // 令牌桶    private $_max;    // 最大令牌數(shù)    /**     * 初始化     * @param Array $config redis連接設(shè)定     */    public function __construct($config, $queue, $max){        $this->_config = $config;        $this->_queue = $queue;        $this->_max = $max;        $this->_redis = $this->connect();    }    /**     * 加入令牌     * @param  Int $num 加入的令牌數(shù)量     * @return Int 加入的數(shù)量     */    public function add($num=0){        // 當(dāng)前剩余令牌數(shù)        $curnum = intval($this->_redis->lSize($this->_queue));        // 最大令牌數(shù)        $maxnum = intval($this->_max);        // 計(jì)算最大可加入的令牌數(shù)量,不能超過(guò)最大令牌數(shù)        $num = $maxnum>=$curnum+$num? $num : $maxnum-$curnum;        // 加入令牌        if($num>0){            $token = array_fill(0, $num, 1);            $this->_redis->lPush($this->_queue, ...$token);            return $num;        }        return 0;    }    /**     * 獲取令牌     * @return Boolean     */    public function get(){        return $this->_redis->rPop($this->_queue)? true : false;    }    /**     * 重設(shè)令牌桶,填滿令牌     */    public function reset(){        $this->_redis->delete($this->_queue);        $this->add($this->_max);    }    /**     * 創(chuàng)建redis連接     * @return Link     */    private function connect(){        try{            $redis = new Redis();            $redis->connect($this->_config['host'],$this->_config['port'],$this->_config['timeout'],$this->_config['reserved'],$this->_config['retry_interval']);            if(empty($this->_config['auth'])){                $redis->auth($this->_config['auth']);            }            $redis->select($this->_config['index']);        }catch(RedisException $e){            throw new Exception($e->getMessage());            return false;        }        return $redis;    }} // class end?>

demo:

<?php/** * 演示令牌加入與消耗 */require 'TrafficShaper.class.php';// redis連接設(shè)定$config = array(    'host' => 'localhost',    'port' => 6379,    'index' => 0,    'auth' => '',    'timeout' => 1,    'reserved' => NULL,    'retry_interval' => 100,);// 令牌桶容器$queue = 'mycontainer';// 最大令牌數(shù)$max = 5;// 創(chuàng)建TrafficShaper對(duì)象$oTrafficShaper = new TrafficShaper($config, $queue, $max);// 重設(shè)令牌桶,填滿令牌$oTrafficShaper->reset();// 循環(huán)獲取令牌,令牌桶內(nèi)只有5個(gè)令牌,因此最后3次獲取失敗for($i=0; $i<8; $i++){    var_dump($oTrafficShaper->get());}// 加入10個(gè)令牌,最大令牌為5,因此只能加入5個(gè)$add_num = $oTrafficShaper->add(10);var_dump($add_num);// 循環(huán)獲取令牌,令牌桶內(nèi)只有5個(gè)令牌,因此最后1次獲取失敗for($i=0; $i<6; $i++){    var_dump($oTrafficShaper->get());}?>

輸出:

boolean trueboolean trueboolean trueboolean trueboolean trueboolean falseboolean falseboolean falseint 5boolean trueboolean trueboolean trueboolean trueboolean trueboolean false

定期加入令牌算法

定期加入令牌,我們可以使用crontab實(shí)現(xiàn),每分鐘調(diào)用add方法加入若干令牌。crontab的使用可以參考:《Linux crontab定時(shí)執(zhí)行任務(wù) 命令格式與詳細(xì)例子》

crontab最小的執(zhí)行間隔為1分鐘,如果令牌桶內(nèi)的令牌在前幾秒就已經(jīng)被消耗完,那么剩下的幾十秒時(shí)間內(nèi),都獲取不到令牌,導(dǎo)致用戶等待時(shí)間較長(zhǎng)。

我們可以優(yōu)化加入令牌的算法,改為一分鐘內(nèi)每若干秒加入若干令牌,這樣可以保證一分鐘內(nèi)每段時(shí)間都有機(jī)會(huì)能獲取到令牌。

crontab調(diào)用的加入令牌程序如下,每秒自動(dòng)加入3個(gè)令牌。

<?php/** * 定時(shí)任務(wù)加入令牌 */require 'TrafficShaper.class.php';// redis連接設(shè)定$config = array(    'host' => 'localhost',    'port' => 6379,    'index' => 0,    'auth' => '',    'timeout' => 1,    'reserved' => NULL,    'retry_interval' => 100,);// 令牌桶容器$queue = 'mycontainer';// 最大令牌數(shù)$max = 10;// 每次時(shí)間間隔加入的令牌數(shù)$token_num = 3;// 時(shí)間間隔,最好是能被60整除的數(shù),保證覆蓋每一分鐘內(nèi)所有的時(shí)間$time_step = 1;// 執(zhí)行次數(shù)$exec_num = (int)(60/$time_step);// 創(chuàng)建TrafficShaper對(duì)象$oTrafficShaper = new TrafficShaper($config, $queue, $max);for($i=0; $i<$exec_num; $i++){    $add_num = $oTrafficShaper->add($token_num);    echo '['.date('Y-m-d H:i:s').'] add token num:'.$add_num.PHP_EOL;    sleep($time_step);}?>

模擬消耗程序如下,每秒消耗2-8個(gè)令牌。

<?php/** * 模擬用戶訪問(wèn)消耗令牌,每段時(shí)間間隔消耗若干令牌 */require 'TrafficShaper.class.php';// redis連接設(shè)定$config = array(    'host' => 'localhost',    'port' => 6379,    'index' => 0,    'auth' => '',    'timeout' => 1,    'reserved' => NULL,    'retry_interval' => 100,);// 令牌桶容器$queue = 'mycontainer';// 最大令牌數(shù)$max = 10;// 每次時(shí)間間隔隨機(jī)消耗的令牌數(shù)量范圍$consume_token_range = array(2, 8);// 時(shí)間間隔$time_step = 1;// 創(chuàng)建TrafficShaper對(duì)象$oTrafficShaper = new TrafficShaper($config, $queue, $max);// 重設(shè)令牌桶,填滿令牌$oTrafficShaper->reset();// 執(zhí)行令牌消耗while(true){    $consume_num = mt_rand($consume_token_range[0], $consume_token_range[1]);    for($i=0; $i<$consume_num; $i++){        $status = $oTrafficShaper->get();        echo '['.date('Y-m-d H:i:s').'] consume token:'.($status? 'true' : 'false').PHP_EOL;    }    sleep($time_step);}?>

演示

設(shè)置定時(shí)任務(wù),每分鐘執(zhí)行一次

* * * * * php /程序的路徑/cron_add.php >> /tmp/cron_add.log

執(zhí)行模擬消耗

php consume_demo.php

執(zhí)行結(jié)果:

[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

因令牌桶一開(kāi)始是滿的(最大令牌數(shù)10),所以之前的10次都能獲取到令牌,10次之后則會(huì)根據(jù)消耗的令牌大于加入令牌數(shù)時(shí),限制訪問(wèn)。
本文講解了php 基于redis使用令牌桶算法實(shí)現(xiàn)流量控制 ,更多相關(guān)內(nèi)容請(qǐng)關(guān)注 。

相關(guān)推薦:

Redis主從同步,讀寫(xiě)分離設(shè)置 的相關(guān)操作

介紹mysql重建表分區(qū)并保留數(shù)據(jù)的方法

PHP生成唯一RequestID類的相關(guān)內(nèi)容

以上就是php 基于redis使用令牌桶算法實(shí)現(xiàn)流量控制的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注 其它相關(guān)文章!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
亚洲国产成人精品一区二区三区| 亚洲精品成人无码熟妇在线| 婷婷亚洲久悠悠色悠在线播放| 亚洲特色特黄| 久久综合之合合综合久久| 国产视频精品xxxx| 亚洲小少妇裸体bbw| 国产日本一区二区三区| 蜜桃专区在线| 欧美日韩一区 二区 三区 久久精品| 国语对白在线视频| 蜜臀国产一区| 国产同性人妖ts口直男| 一区二区三区四区五区在线| 一个人看的www视频在线免费观看| 国产精品欧美在线| 亚洲va国产日韩欧美精品色婷婷| 精品在线免费视频| 国产一级生活片| 亚洲香蕉伊综合在人在线视看| 任你操这里只有精品| 日本一区二区成人| 欧美r级电影在线观看| 国产不卡高清在线观看视频| 欧美性猛交xxxxxxxx| 免费高清在线观看| 日韩精品一级毛片在线播放| 麻豆成人91精品二区三区| 波多野结衣网页| 亚洲成年人在线播放| 成人免费一区二区三区牛牛| 久久精品视频在线看| 日本熟女毛茸茸| 亚洲精品麻豆| 欧美日韩精品一区二区在线播放| 国产亚洲一区二区手机在线观看| 91精品国产91久久| 欧美日本视频在线观看| 国产精品美女一区二区在线观看| 亚洲精品乱码久久久久久蜜桃麻豆| 久久人人爽人人| 国产精品久久久久久久久鸭| 亚洲主播在线播放| 青青青爽久久午夜综合久久午夜| 精品国产百合女同互慰| 六月丁香激情综合| 国产亚洲第一伦理第一区| 亚洲青青青在线视频| 黑人精品xxx一区一二区| 亚洲色图第一区| 国产高清在线观看免费不卡| 99鲁鲁精品一区二区三区| av一级黄色片| 成人欧美一区二区三区在线播放| 中文字幕av日韩| 91精品国产高清一区二区三区| 啊啊啊啊啊啊啊视频在线播放| 久久先锋影音av鲁色资源网| 国产精品视频免费一区| 最近2019中文字幕大全第二页| 日韩精品视频免费在线观看| 激情久久一区| 日韩免费高清一区二区| 久做在线视频免费观看| 大片免费在线观看| 欧美一级国产精品| 大片免费在线观看| 麻豆成人精品| 国产精品视频免费在线| 四虎影视1304t| 国产精品视频中文字幕| 天堂av手机在线| 视频在线观看入口黄最新永久免费国产| 国产真实乱人偷精品视频| 日本色护士高潮视频在线观看| 久久精品国产视频| 91精品在线一区| 青青国产在线视频| 91极品女神在线| 亚洲一级免费视频| 欧美日韩国产在线播放| 欧美中文字幕在线播放| 午夜欧美激情| 夜夜嗨av一区二区三区网站四季av| 91久久精品一区二区三| 久久亚洲一区二区三区四区五区高| 国产美女作爱全过程免费视频| 亚洲福利国产| 一卡二卡3卡四卡高清精品视频| 国产又粗又长又黄| www.日本不卡| 日韩精品在线免费| 高h视频在线观看| 国产日韩欧美精品一区二区三区| 青青久久av| 日韩一级在线视频| 夜夜爽妓女8888视频免费观看| 欧美日韩一区二区视频在线| 无夜福利视频观看| 91麻豆精品视频| 国产成人tv| 国产精品久久久久久久久鸭| 亚洲国产毛片完整版| 亚洲欧美国产一区二区三区| 放荡的美妇在线播放| 亚洲男人第一av| 一本一本久久a久久精品综合小说| 国产亚洲精品高潮| 新婚的少妇hd中文字幕| 天天超碰亚洲| 欧美日韩国产一区中文午夜| 国产不卡的av| 尤物yw193can在线观看| 一本久久知道综合久久| 国产探花在线免费观看| 欧美高清视频看片在线观看| 午夜视频1000| 久久久成人av毛片免费观看| 在线观看久久久久久| 日韩系列欧美系列| 日本在线视频网址| 亚洲人a成www在线影院| 国产在线播放一区二区| 黑人精品一区二区| 欧美日韩电影一区二区三区| 中文字幕视频在线免费欧美日韩综合在线看| 成熟老妇女视频| 妞干网在线观看视频| 国产精品久久三| 丁香花在线影院观看在线播放| 亚洲成人网久久久| 精品伦一区二区三区| 国产精品福利观看| 亚洲最新中文字幕| xvideos.蜜桃一区二区| 国产亚洲精品女人久久久久久| 精品久久久久久最新网址| 可以在线观看av的网站| 少妇淫片在线影院| 中文字幕成人在线| 久久久久久久久久看片| 柠檬在线导航福利| 亚洲AV无码成人精品区明星换面| 欧美一区二区女人| 超碰在线国产97| 日本综合精品一区| 番号集在线观看| 久久爱另类一区二区小说| 在线亚洲一区观看| av在线不卡网站| 一本大道久久a久久精品| 欧美日韩人妻精品一区二区三区| 欧美久久久久中文字幕| 嗯~啊~轻一点视频日本在线观看| 免费日韩精品中文字幕视频在线| 国产欧美一区二区三区米奇| 国产成人精品免费视频大全最热| 91在线精品一区二区| 国产chinese中国hdxxxx| 国产精品99蜜臀久久不卡二区| 比比资源先锋| 色在线视频观看| 欧美一级大片在线免费观看| 天堂视频免费在线观看| 亚洲欧洲专区| 国产成人av自拍| 手机看片福利永久国产日韩| 在线观看一区二区精品视频| 久久久久久久久久久久久久久久久久久| 国产日韩欧美精品在线观看| 日韩一级片在线观看| 精品国产一区二区三区四区在线观看| 91久久精品一区二区三| 国产suv精品一区二区三区| 久草视频手机在线观看| 国产在线精品一区二区不卡| 777精品伊人久久久久大香线蕉| 男人天堂视频在线| 538在线一区二区精品国产| 久久青草福利网站| 五月天六月丁香| 日韩在线观看免费高清| 在线视频不卡一区二区三区| 国产精品第五页| 国产美女主播在线观看| 国内精品在线播放| 视频免费一区| 亚洲成人亚洲激情| 麻豆视频传媒入口| 亚洲日本一区二区| 黄色在线视频观看网站| 欧美91看片特黄aaaa| www黄com| 欧美xxxx吸乳| 国内精品久久久久久久果冻传媒| 黑人精品一区二区| 久久99视频免费| 亚洲国产精品资源| 天天操夜夜摸| 国色天香一区二区| 黄色一级大片在线观看| 国产永久免费网站| 日本在线一二三区| 99国产盗摄| 日韩国产欧美在线观看| 亚洲国产精品狼友在线观看| 日韩电影免费观看中文字幕| 亚洲另类在线视频| 素人一区二区三区| 国产黄色一级片| 中文字幕日本一区| 最近免费中文字幕大全免费版视频| 欧美一级日本a级v片| 国产精品久久久久久久久久久久久久| 日本一区二区三区在线播放| 巨胸喷奶水www久久久免费动漫| 榴莲视频成人app| 欧美黑人疯狂性受xxxxx野外| 激情成人在线视频| 国产伦精品一区二区三区视频痴汉| 国产精品国产精品国产专区蜜臀ah| 性xxxfreexxxx性欧美| 中文字幕一区二区三区在线观看| 年轻的保姆91精品| 日本一区二区电影| 亚洲在线视频一区| 国产一区二区免费看| 91年精品国产| 日本精品免费一区二区三区| 亚洲大尺度视频在线观看| 成人黄色在线看| 免费视频网站在线观看入口| 青草影视电视剧免费播放在线观看| 日韩成人一区二区三区在线观看| 国产美女视频一区二区二三区| 丰满人妻一区二区三区53号| 亚洲自拍偷拍一区二区| 韩国v欧美v日本v亚洲v| 中文字幕乱码日本亚洲一区二区| 一区二区三区在线免费观看| 人妻无码一区二区三区久久99| 亚洲精品视频一区| 久草网在线观看| 国产成人无码av在线播放dvd| 中文字幕亚洲情99在线| 亚洲丝袜另类动漫二区| 男人猛进猛出女人屁股视频| 日韩精品中文字幕在线| 91久久亚洲| 免费国产一区二区| 欧美激情福利| 日韩av毛片在线观看| 国产成人精品一区二| 欧美一区二区影视| 日韩无套无码精品| 精品国产依人香蕉在线精品| 亚洲国产中文在线二区三区免| 人妻精油按摩bd高清中文字幕| 老鸭窝亚洲一区二区三区| √…a在线天堂一区| 久久精品免费一区二区三区| 中文字幕影音先锋| 午夜久久电影网| 亚洲**2019国产| 欧美激情久久久久久久久久久| 91日本在线视频| 欧美在线1区| 欧美国产日韩一区二区在线观看| 精品一卡二卡三卡四卡日本乱码| 免费在线观看一区二区| www.av在线视频| 天天干天天插天天射| 国产婷婷成人久久av免费高清| 欧美国产国产综合| 久激情内射婷内射蜜桃| 国产精品久久久久久久久免费看| 久久久青草青青国产亚洲免观| 欧美日韩大片免费观看| 国产精品无码一区二区在线| 欧美福利在线视频| 国产成人av电影在线| 色乱码一区二区三区熟女| 老熟妇仑乱视频一区二区| 亚洲av无码片一区二区三区| 一区二区三区亚洲| 中文字幕你懂的| 捆绑调教日本一区二区三区| 少妇人妻无码专区视频| 欧美日韩系列| 中国av一区二区三区| 六十路息与子猛烈交尾| 涩爱av色老久久精品偷偷鲁| 91电影在线播放| 日韩欧美亚洲国产另类| 欧美爱爱小视频| 美女激情福利视频在线观看| 色屁屁草草影院ccyycom| 欧美激情va永久在线播放| 精品国产av 无码一区二区三区| 韩国一区二区三区视频| 妖精视频一区二区| 国产成人福利片| 91国产视频在线观看| 国产一二区在线| 国产91社区| 污视频网站在线观看| 日韩一区二区在线看| 成人精品免费在线观看| 综合久草视频| 国产精品美女一区二区三区| 99国产精品久久久久久久久久久| 女同性αv亚洲女同志| 91精品国产91久久久久久三级| 亚洲色欲综合一区二区三区| 欧美成人精品一区二区三区在线看| 一级黄色免费看| 国产美女福利在线| 国产69精品久久app免费版| 国产美女免费观看| 美女高潮网站| 超碰这里只有精品| 亚洲欧美日本一区二区| 精品粉嫩超白一线天av| 亚洲乱妇老熟女爽到高潮的片| 香港三日本8a三级少妇三级99| 久久日文中文字幕乱码| 亚洲砖区区免费| 国产精品白嫩白嫩大学美女|