国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

[php]如何做到高并發(fā)優(yōu)化

Sunxb / 1373人閱讀

摘要:說白了就是每天訪問的用戶數(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&&$valdel($key);
            }
            return  $this->_redis->setnx($key,time()+$expTime);
        }
    }
    /**
     * @param $key 解鎖
     */
    public function del($key)
    {
        $this->_redis->del($key);
    }
}

$pdo = new PDO("mysql:host=127.0.0.1;dbname=test", "root", "root");
$lockObj = Lock::getInstance();  //單例模式
//判斷是能加鎖成功
if($lock = $lockObj->set("storage",10))
{
    $sql="select `number` from  storage where id=1 limit 1";
    $res = $pdo->query($sql)->fetch();
    $number = $res["number"];
    if($number>0)
    {
        $sql ="insert into `order`  VALUES (null,$number)";

        $order_id = $pdo->query($sql);
        if($order_id)
        {

            $sql="update storage set `number`=`number`-1 WHERE id=1";
            $pdo->query($sql);
        }
    }
    //解鎖
    $lockObj->del("storage");

}
else
{
    //加鎖不成功執(zhí)行其他操作。
}
?>  



(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)文章

  • 前端也該了解的一些后端知識

    摘要:而后端的知識是與前端工作最密切相關(guān)的一部分內(nèi)容,多了解些后端的知識也是大有裨益的。本文簡單敘述了三種構(gòu)建大型架構(gòu)的必備知識。而作為一個前端兒,許多技術(shù)可能無法在工程項目中親自去實(shí)踐,也只能從書,講座,博文中學(xué)習(xí)了。 前言 作為一個有追求的前端,在學(xué)有余力的同時,不應(yīng)該把自己僅僅局限于前端的世界中的。而后端的知識是與前端工作最密切相關(guān)的一部分內(nèi)容,多了解些后端的知識也是大有裨益的。 本文...

    leanote 評論0 收藏0
  • 前端也該了解的一些后端知識

    摘要:而后端的知識是與前端工作最密切相關(guān)的一部分內(nèi)容,多了解些后端的知識也是大有裨益的。本文簡單敘述了三種構(gòu)建大型架構(gòu)的必備知識。而作為一個前端兒,許多技術(shù)可能無法在工程項目中親自去實(shí)踐,也只能從書,講座,博文中學(xué)習(xí)了。 前言 作為一個有追求的前端,在學(xué)有余力的同時,不應(yīng)該把自己僅僅局限于前端的世界中的。而后端的知識是與前端工作最密切相關(guān)的一部分內(nèi)容,多了解些后端的知識也是大有裨益的。 本文...

    OnlyMyRailgun 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<