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

資訊專欄INFORMATION COLUMN

[php]如何做到高并發優化

Sunxb / 1365人閱讀

摘要:說白了就是每天訪問的用戶數每秒查詢率每秒鐘請求或者查詢的數量,在互聯網領域,指每秒響應請求數指請求二層面如何優化高并發層面利用加鎖機制處理將的值設為,當且僅當不存在。若給定的已經存在,則不做任何動作。

在實際的開發過程中我們遇到過各種各樣的活動,但像用戶流量較大的平臺就需要考慮高并發的問題,但是如何去解決呢?我總結了幾種解決方案,歡迎大家指正!

一、什么是PV/UV/QPS?

PV:頁面訪問量,即PageView,用戶每次對網站的訪問均被記錄,用戶對同一頁面的多次訪問,訪問量累計。(說白了就是用戶的點擊次數)  
UV:獨立訪問用戶數:即UniqueVisitor,訪問網站的一臺電腦客戶端為一個訪客。00:00-24:00內相同的客戶端只被計算一次。(說白了就是每天訪問的用戶數)
QPS: (每秒查詢率) : 每秒鐘請求或者查詢的數量,在互聯網領域,指每秒響應請求數(指HTTP請求)

二、php層面如何優化高并發?
1.redis層面:
(1)利用redis加鎖機制處理setnx key value:將 key 的值設為 value,當且僅當 key 不存在。 若給定的 key 已經存在,則 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
        {
            //加鎖失敗的情況下。判斷鎖是否已經存在,如果鎖存在且已經過期,那么刪除鎖。進行重新加鎖
            $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
{
    //加鎖不成功執行其他操作。
}
?>  



(2)利用reids消息隊列處理高并發:隊列是按先進先出的順序來執行,需要用到 lpop、rpush、llen等方法

/**
*優惠券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."張優惠券時失敗");
            }
            //在redis中存入數據
            $redis->rPush("yhq_relation","{$i}");
        }
        $redis->expire("yhq_relation",1860);
        $this->_success("","庫內添加優惠券成功");
    }
/**
*領取優惠券
**/
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());
    //判斷是否在搶購時間內
    //$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("優惠券已經搶光啦~");
    }else{
        //領取優惠券時判斷用戶是否真正領取
        $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("對不起,您已經領取過了哦~");
        }else{
            //用戶領取優惠券
            $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"];
            //雙重判斷是否已經領取完畢
            if (!$update_id){
                $this->_error("優惠券已經搶光了哦~");
            }
            $redis->lPop("yhq_relation");
            $res = $yhq_dom->update("id={$update_id}",["accid"=>$user_id,"expire_time"=>$expire_time]);
            if ($res){
                $this->_success("","領取成功");
            }else{
                $this->_error("領取失敗,請查看網絡連接");
            }
        }
    }
}



2.數據庫層面(暫時沒有總結好)

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/29459.html

相關文章

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

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

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

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

    leanote 評論0 收藏0

發表評論

0條評論

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