摘要:說白了就是每天訪問的用戶數(shù)每秒查詢率每秒鐘請求或者查詢的數(shù)量,在互聯(lián)網(wǎng)領(lǐng)域,指每秒響應(yīng)請求數(shù)指請求二層面如何優(yōu)化高并發(fā)層面利用加鎖機(jī)制處理將的值設(shè)為,當(dāng)且僅當(dāng)不存在。若給定的已經(jīng)存在,則不做任何動作。
在實(shí)際的開發(fā)過程中我們遇到過各種各樣的活動,但像用戶流量較大的平臺就需要考慮高并發(fā)的問題,但是如何去解決呢?我總結(jié)了幾種解決方案,歡迎大家指正!
一、什么是PV/UV/QPS?
PV:頁面訪問量,即PageView,用戶每次對網(wǎng)站的訪問均被記錄,用戶對同一頁面的多次訪問,訪問量累計。(說白了就是用戶的點(diǎn)擊次數(shù))
UV:獨(dú)立訪問用戶數(shù):即UniqueVisitor,訪問網(wǎng)站的一臺電腦客戶端為一個訪客。00:00-24:00內(nèi)相同的客戶端只被計算一次。(說白了就是每天訪問的用戶數(shù))
QPS: (每秒查詢率) : 每秒鐘請求或者查詢的數(shù)量,在互聯(lián)網(wǎng)領(lǐng)域,指每秒響應(yīng)請求數(shù)(指HTTP請求)
二、php層面如何優(yōu)化高并發(fā)?
1.redis層面:
(1)利用redis加鎖機(jī)制處理setnx key value:將 key 的值設(shè)為 value,當(dāng)且僅當(dāng) key 不存在。 若給定的 key 已經(jīng)存在,則 SETNX 不做任何動作。SETNX 是SET if Not eXists的簡寫。
_redis = new Redis(); $this->_redis ->connect("127.0.0.1"); } public static function getInstance() { if(self::$_instance instanceof self) { return self::$_instance; } return self::$_instance = new self(); } /** * @function 加鎖 * @param $key 鎖名稱 * @param $expTime 過期時間 */ public function set($key,$expTime) { //初步加鎖 $isLock = $this->_redis->setnx($key,time()+$expTime); if($isLock) { return true; } else { //加鎖失敗的情況下。判斷鎖是否已經(jīng)存在,如果鎖存在且已經(jīng)過期,那么刪除鎖。進(jìn)行重新加鎖 $val = $this->_redis->get($key); if($val&&$val
(2)利用reids消息隊列處理高并發(fā):隊列是按先進(jìn)先出的順序來執(zhí)行,需要用到 lpop、rpush、llen等方法
/** *優(yōu)惠券redis入庫 **/ public function reload_quan(){ $yhq_dom = Yhq_user_relation::i(); $redis = Redis::i("redis"); $redis->setOption( Redis::OPT_SERIALIZER, Redis::SERIALIZER_NONE ); for ($i=0;$i<100;$i++){ $date_time = date("Y-m-d H:i:s",time()); $res = $yhq_dom->add([ "hd_id" => 3, "yhq_id"=> 19, "name" => "滿58減20", "create_time" => $date_time, "price" => 58, "yuanbao" => 20 ]); if (!$res){ $this->_error("添加第".$i."張優(yōu)惠券時失敗"); } //在redis中存入數(shù)據(jù) $redis->rPush("yhq_relation","{$i}"); } $redis->expire("yhq_relation",1860); $this->_success("","庫內(nèi)添加優(yōu)惠券成功"); } /** *領(lǐng)取優(yōu)惠券 **/ public function get_quan(){ $redis = Redis::i("redis"); $redis->setOption( Redis::OPT_SERIALIZER, Redis::SERIALIZER_NONE ); $start_time = date("Y-m-d 00:00:00",time()); $stop_time = date("Y-m-d 23:59:59",time()); //判斷是否在搶購時間內(nèi) //$start_string = mktime(12,0,0,date("m"),date("d")-date("w")+5,date("Y")); //$stop_string = mktime(23,59,59,date("m"),date("d")-date("w")+5,date("Y")); //$now_time = time(); //if ($now_time<$start_string || $now_time>$stop_string){ // $this->_error("搶券時間未到,請稍后再來~"); //} $len = $redis->lLen("yhq_relation"); if ($len<1){ $this->_error("優(yōu)惠券已經(jīng)搶光啦~"); }else{ //領(lǐng)取優(yōu)惠券時判斷用戶是否真正領(lǐng)取 $user_id = $this->_user_info()["accid"]; $yhq_dom = Yhq_user_relation::i(); $where = [ "accid" => $user_id, "hd_id" => 3, "yhq_id"=>19, "create_time" => [ "between" => [$start_time,$stop_time] ] ]; $result = $yhq_dom->where($where)->find(); if($result){ $this->_error("對不起,您已經(jīng)領(lǐng)取過了哦~"); }else{ //用戶領(lǐng)取優(yōu)惠券 $expire_time = date("Y-m-d H:i:s",(time()+259200)); $sql = "select id from yhq_user_relation where hd_id = 3 and yhq_id=19 and create_time between "$start_time" and "$stop_time" and accid is NULL ORDER by create_time ASC "; $update_id = $yhq_dom->query($sql)[0]["id"]; //雙重判斷是否已經(jīng)領(lǐng)取完畢 if (!$update_id){ $this->_error("優(yōu)惠券已經(jīng)搶光了哦~"); } $redis->lPop("yhq_relation"); $res = $yhq_dom->update("id={$update_id}",["accid"=>$user_id,"expire_time"=>$expire_time]); if ($res){ $this->_success("","領(lǐng)取成功"); }else{ $this->_error("領(lǐng)取失敗,請查看網(wǎng)絡(luò)連接"); } } } }
2.數(shù)據(jù)庫層面(暫時沒有總結(jié)好)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/29459.html
摘要:而后端的知識是與前端工作最密切相關(guān)的一部分內(nèi)容,多了解些后端的知識也是大有裨益的。本文簡單敘述了三種構(gòu)建大型架構(gòu)的必備知識。而作為一個前端兒,許多技術(shù)可能無法在工程項目中親自去實(shí)踐,也只能從書,講座,博文中學(xué)習(xí)了。 前言 作為一個有追求的前端,在學(xué)有余力的同時,不應(yīng)該把自己僅僅局限于前端的世界中的。而后端的知識是與前端工作最密切相關(guān)的一部分內(nèi)容,多了解些后端的知識也是大有裨益的。 本文...
摘要:而后端的知識是與前端工作最密切相關(guān)的一部分內(nèi)容,多了解些后端的知識也是大有裨益的。本文簡單敘述了三種構(gòu)建大型架構(gòu)的必備知識。而作為一個前端兒,許多技術(shù)可能無法在工程項目中親自去實(shí)踐,也只能從書,講座,博文中學(xué)習(xí)了。 前言 作為一個有追求的前端,在學(xué)有余力的同時,不應(yīng)該把自己僅僅局限于前端的世界中的。而后端的知識是與前端工作最密切相關(guān)的一部分內(nèi)容,多了解些后端的知識也是大有裨益的。 本文...
閱讀 2876·2021-10-08 10:12
閱讀 3977·2021-09-22 15:45
閱讀 2566·2019-08-30 15:52
閱讀 2634·2019-08-29 18:44
閱讀 2655·2019-08-29 12:37
閱讀 1164·2019-08-26 13:36
閱讀 2569·2019-08-26 13:34
閱讀 1483·2019-08-26 12:20