摘要:解決高并發(fā)瓶頸解決紅包程序本程序模擬的紅包抽獎模式。總金額元,隨機用戶獲得元的紅包,直到紅包分發(fā)完。
解決高并發(fā) io瓶頸解決紅包程序
本程序模擬的紅包抽獎模式。總金額100元,隨機用戶獲得1-10元的紅包,直到紅包分發(fā)完。
redis中l(wèi)uckMoneyMax需要提前設置
$r->set("luckMoneyMax" , 100);
正文
/** * 隨機獲取紅包 * 總金額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秒超時 一個鎖超過4s還沒釋放 說明得到鎖的線程掛了 其他線程需要競爭釋放鎖 再得到鎖 $get_lock = $r->setnx($lock_key,$lock_timout); //得到鎖的條件 setnx返回值為真 超時并且getSet保證了不會多個進程去釋放鎖 $now = time(); if($get_lock || ( ($now > $r->get($lock_key)) && ($now > $r->getSet($lock_key , $lock_timout)) ) ){ echo "去抽獎!swoole多線程測試
"; break;//去抽獎 } } $luckMoneyMax = $r->get("luckMoneyMax"); if($luckMoneyMax <= 0){ echo "獎金池空了!"; if((time() < $lock_timout) && $r->del($lock_key)){ echo "
毫秒時間:".$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 "恭喜中獎".$redBag; if((time() < $lock_timout) && $r->del($lock_key)){ echo "
毫秒時間:".$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 "恭喜中獎".$redBag."元"; if((time() < $lock_timout) && $r->del($lock_key)){ echo "
毫秒時間:".$this->msectime()."釋放鎖成功"; } } /** * 毫秒級 * @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 次就抽取完畢
毫秒 | 紅包金額 |
---|---|
毫秒時間1514386342125 | 紅包10元 |
毫秒時間1514386342106 | 紅包10元 |
毫秒時間1514386342086 | 紅包10元 |
毫秒時間1514386342066 | 紅包7元 |
毫秒時間1514386342046 | 紅包6元 |
毫秒時間1514386342026 | 紅包5元 |
毫秒時間1514386342007 | 紅包3元 |
毫秒時間1514386341988 | 紅包1元 |
毫秒時間1514386341968 | 紅包7元 |
毫秒時間1514386341950 | 紅包5元 |
毫秒時間1514386341931 | 紅包8元 |
毫秒時間1514386341913 | 紅包7元 |
毫秒時間1514386341894 | 紅包1元 |
毫秒時間1514386341875 | 紅包1元 |
毫秒時間1514386341856 | 紅包9元 |
毫秒時間1514386341836 | 紅包10元 |
合計 | 100元 |
推薦:
100萬個openid快速存入redis
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/26276.html
摘要:在中一般來說通過來創(chuàng)建所需要的線程池,如高并發(fā)原理初探后端掘金閱前熱身為了更加形象的說明同步異步阻塞非阻塞,我們以小明去買奶茶為例。 AbstractQueuedSynchronizer 超詳細原理解析 - 后端 - 掘金今天我們來研究學習一下AbstractQueuedSynchronizer類的相關原理,java.util.concurrent包中很多類都依賴于這個類所提供的隊列式...
摘要:在中一般來說通過來創(chuàng)建所需要的線程池,如高并發(fā)原理初探后端掘金閱前熱身為了更加形象的說明同步異步阻塞非阻塞,我們以小明去買奶茶為例。 AbstractQueuedSynchronizer 超詳細原理解析 - 后端 - 掘金今天我們來研究學習一下AbstractQueuedSynchronizer類的相關原理,java.util.concurrent包中很多類都依賴于這個類所提供的隊列式...
摘要:表示的是兩個,當其中任意一個計算完并發(fā)編程之是線程安全并且高效的,在并發(fā)編程中經常可見它的使用,在開始分析它的高并發(fā)實現(xiàn)機制前,先講講廢話,看看它是如何被引入的。電商秒殺和搶購,是兩個比較典型的互聯(lián)網高并發(fā)場景。 干貨:深度剖析分布式搜索引擎設計 分布式,高可用,和機器學習一樣,最近幾年被提及得最多的名詞,聽名字多牛逼,來,我們一步一步來擊破前兩個名詞,今天我們首先來說說分布式。 探究...
閱讀 648·2021-09-24 09:48
閱讀 2498·2021-08-26 14:14
閱讀 522·2019-08-30 13:08
閱讀 1449·2019-08-29 15:22
閱讀 3080·2019-08-29 11:06
閱讀 1008·2019-08-26 18:26
閱讀 1051·2019-08-26 13:53
閱讀 2532·2019-08-26 12:21