摘要:解決高并發(fā)瓶頸解決紅包程序本程序模擬的紅包抽獎(jiǎng)模式。總金額元,隨機(jī)用戶獲得元的紅包,直到紅包分發(fā)完。
解決高并發(fā) io瓶頸解決紅包程序
本程序模擬的紅包抽獎(jiǎng)模式??偨痤~100元,隨機(jī)用戶獲得1-10元的紅包,直到紅包分發(fā)完。
redis中l(wèi)uckMoneyMax需要提前設(shè)置
$r->set("luckMoneyMax" , 100);
正文
/** * 隨機(jī)獲取紅包 * 總金額100元 * 每次紅包大小[1,10] */ public function luckMoney() { $r = new Redis(); $r->pconnect("127.0.0.1","6379"); $r->select(1); $lock_key = "lockkey"; while(true){ $lock_timout = time()+3+1; //4秒超時(shí) 一個(gè)鎖超過4s還沒釋放 說明得到鎖的線程掛了 其他線程需要競(jìng)爭(zhēng)釋放鎖 再得到鎖 $get_lock = $r->setnx($lock_key,$lock_timout); //得到鎖的條件 setnx返回值為真 超時(shí)并且getSet保證了不會(huì)多個(gè)進(jìn)程去釋放鎖 $now = time(); if($get_lock || ( ($now > $r->get($lock_key)) && ($now > $r->getSet($lock_key , $lock_timout)) ) ){ echo "去抽獎(jiǎng)!swoole多線程測(cè)試
"; break;//去抽獎(jiǎng) } } $luckMoneyMax = $r->get("luckMoneyMax"); if($luckMoneyMax <= 0){ echo "獎(jiǎng)金池空了!"; if((time() < $lock_timout) && $r->del($lock_key)){ echo "
毫秒時(shí)間:".$this->msectime()."釋放鎖成功"; } return; }elseif($luckMoneyMax <= 1){ $redBag = $luckMoneyMax; $r->set("luckMoneyMax" , 0); $data_arr = [ "redBag"=>$redBag, "mstime"=>$this->msectime() ]; $r->lpush("redBag-list", serialize($data_arr)); echo "恭喜中獎(jiǎng)".$redBag; if((time() < $lock_timout) && $r->del($lock_key)){ echo "
毫秒時(shí)間:".$this->msectime()."釋放鎖成功"; } return; } //1-10 十元整數(shù) $redBag = rand(1,10); $tmp_money = $luckMoneyMax-$redBag; if($tmp_money < 0){ $redBag = $luckMoneyMax; $tmp_money=0; } $r->set("luckMoneyMax" , $tmp_money); $data_arr = [ "redBag"=>$redBag, "mstime"=>$this->msectime() ]; $r->lpush("redBag-list", serialize($data_arr)); echo "恭喜中獎(jiǎng)".$redBag."元"; if((time() < $lock_timout) && $r->del($lock_key)){ echo "
毫秒時(shí)間:".$this->msectime()."釋放鎖成功"; } } /** * 毫秒級(jí) * @return float */ public function msectime() { list($msec, $sec) = explode(" ", microtime()); $msectime = (float)sprintf("%.0f", (floatval($msec) + floatval($sec)) * 1000); return $msectime; }
start(); echo PHP_EOL;//PHP_EOL換行的意思 echo $red_process->read(); echo PHP_EOL; } echo "end:".date("Y-m-d H:i:s").PHP_EOL; function getMoney(swoole_process $worker) { $content = getHTTPS("http://example.com/index/index/luckMoney.html"); $worker->write($content); } function getHTTPS($url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_REFERER, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); $result = curl_exec($ch); curl_close($ch); return $result; }
2s 100 次就抽取完畢
毫秒 | 紅包金額 |
---|---|
毫秒時(shí)間1514386342125 | 紅包10元 |
毫秒時(shí)間1514386342106 | 紅包10元 |
毫秒時(shí)間1514386342086 | 紅包10元 |
毫秒時(shí)間1514386342066 | 紅包7元 |
毫秒時(shí)間1514386342046 | 紅包6元 |
毫秒時(shí)間1514386342026 | 紅包5元 |
毫秒時(shí)間1514386342007 | 紅包3元 |
毫秒時(shí)間1514386341988 | 紅包1元 |
毫秒時(shí)間1514386341968 | 紅包7元 |
毫秒時(shí)間1514386341950 | 紅包5元 |
毫秒時(shí)間1514386341931 | 紅包8元 |
毫秒時(shí)間1514386341913 | 紅包7元 |
毫秒時(shí)間1514386341894 | 紅包1元 |
毫秒時(shí)間1514386341875 | 紅包1元 |
毫秒時(shí)間1514386341856 | 紅包9元 |
毫秒時(shí)間1514386341836 | 紅包10元 |
合計(jì) | 100元 |
推薦:
100萬(wàn)個(gè)openid快速存入redis
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/26276.html
摘要:在中一般來說通過來創(chuàng)建所需要的線程池,如高并發(fā)原理初探后端掘金閱前熱身為了更加形象的說明同步異步阻塞非阻塞,我們以小明去買奶茶為例。 AbstractQueuedSynchronizer 超詳細(xì)原理解析 - 后端 - 掘金今天我們來研究學(xué)習(xí)一下AbstractQueuedSynchronizer類的相關(guān)原理,java.util.concurrent包中很多類都依賴于這個(gè)類所提供的隊(duì)列式...
摘要:在中一般來說通過來創(chuàng)建所需要的線程池,如高并發(fā)原理初探后端掘金閱前熱身為了更加形象的說明同步異步阻塞非阻塞,我們以小明去買奶茶為例。 AbstractQueuedSynchronizer 超詳細(xì)原理解析 - 后端 - 掘金今天我們來研究學(xué)習(xí)一下AbstractQueuedSynchronizer類的相關(guān)原理,java.util.concurrent包中很多類都依賴于這個(gè)類所提供的隊(duì)列式...
摘要:表示的是兩個(gè),當(dāng)其中任意一個(gè)計(jì)算完并發(fā)編程之是線程安全并且高效的,在并發(fā)編程中經(jīng)??梢娝氖褂茫陂_始分析它的高并發(fā)實(shí)現(xiàn)機(jī)制前,先講講廢話,看看它是如何被引入的。電商秒殺和搶購(gòu),是兩個(gè)比較典型的互聯(lián)網(wǎng)高并發(fā)場(chǎng)景。 干貨:深度剖析分布式搜索引擎設(shè)計(jì) 分布式,高可用,和機(jī)器學(xué)習(xí)一樣,最近幾年被提及得最多的名詞,聽名字多牛逼,來,我們一步一步來?yè)羝魄皟蓚€(gè)名詞,今天我們首先來說說分布式。 探究...
摘要:表示的是兩個(gè),當(dāng)其中任意一個(gè)計(jì)算完并發(fā)編程之是線程安全并且高效的,在并發(fā)編程中經(jīng)常可見它的使用,在開始分析它的高并發(fā)實(shí)現(xiàn)機(jī)制前,先講講廢話,看看它是如何被引入的。電商秒殺和搶購(gòu),是兩個(gè)比較典型的互聯(lián)網(wǎng)高并發(fā)場(chǎng)景。 干貨:深度剖析分布式搜索引擎設(shè)計(jì) 分布式,高可用,和機(jī)器學(xué)習(xí)一樣,最近幾年被提及得最多的名詞,聽名字多牛逼,來,我們一步一步來?yè)羝魄皟蓚€(gè)名詞,今天我們首先來說說分布式。 探究...
摘要:表示的是兩個(gè),當(dāng)其中任意一個(gè)計(jì)算完并發(fā)編程之是線程安全并且高效的,在并發(fā)編程中經(jīng)??梢娝氖褂?,在開始分析它的高并發(fā)實(shí)現(xiàn)機(jī)制前,先講講廢話,看看它是如何被引入的。電商秒殺和搶購(gòu),是兩個(gè)比較典型的互聯(lián)網(wǎng)高并發(fā)場(chǎng)景。 干貨:深度剖析分布式搜索引擎設(shè)計(jì) 分布式,高可用,和機(jī)器學(xué)習(xí)一樣,最近幾年被提及得最多的名詞,聽名字多牛逼,來,我們一步一步來?yè)羝魄皟蓚€(gè)名詞,今天我們首先來說說分布式。 探究...
閱讀 665·2021-09-24 09:48
閱讀 2501·2021-08-26 14:14
閱讀 526·2019-08-30 13:08
閱讀 1455·2019-08-29 15:22
閱讀 3088·2019-08-29 11:06
閱讀 1013·2019-08-26 18:26
閱讀 1071·2019-08-26 13:53
閱讀 2546·2019-08-26 12:21