久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

php+redis實(shí)現(xiàn)商城秒殺功能

這篇文章主要為大家詳細(xì)介紹了php+redis實(shí)現(xiàn)商城秒殺功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

好久沒來整理文章了,閑了沒事寫篇文章記錄下php+redis實(shí)現(xiàn)商城秒殺功能。

1、安裝redis,根據(jù)自己的php版本安裝對(duì)應(yīng)的redis擴(kuò)展(此步驟簡(jiǎn)單的描述一下)

1.1.安裝php_igbinary.dll,php_redis.dll擴(kuò)展此處需要注意你的php版本如圖:

1.2.php.ini文件新增extension=php_igbinary.dll;extension=php_redis.dll兩處擴(kuò)展

ok此處已經(jīng)完成第一步redis環(huán)境搭建完成看看phpinfo

2、項(xiàng)目中實(shí)際使用redis

2.1.第一步配置redis參數(shù)如下,redis安裝的默認(rèn)端口為6379: 

<?php
/* 數(shù)據(jù)庫(kù)配置 */
return array(
  'DATA_CACHE_PREFIX' => 'Redis_',//緩存前綴
  'DATA_CACHE_TYPE'=>'Redis',//默認(rèn)動(dòng)態(tài)緩存為Redis
  'DATA_CACHE_TIMEOUT' => false,
  'REDIS_RW_SEPARATE' => true, //Redis讀寫分離 true 開啟
  'REDIS_HOST'=>'127.0.0.1', //redis服務(wù)器ip,多臺(tái)用逗號(hào)隔開;讀寫分離開啟時(shí),第一臺(tái)負(fù)責(zé)寫,其它[隨機(jī)]負(fù)責(zé)讀;
  'REDIS_PORT'=>'6379',//端口號(hào)
  'REDIS_TIMEOUT'=>'300',//超時(shí)時(shí)間
  'REDIS_PERSISTENT'=>false,//是否長(zhǎng)連接 false=短連接
  'REDIS_AUTH'=>'',//AUTH認(rèn)證密碼 
);
?>

2.2.實(shí)際函數(shù)中使用redis:

/**
    * redis連接
    * @access private
    * @return resource
    * @author bieanju
    */
  private function connectRedis(){
    $redis=new \Redis();
    $redis->connect(C("REDIS_HOST"),C("REDIS_PORT"));    
    return $redis;
  }

2.3. 秒殺的核心問題是在大并發(fā)的情況下不會(huì)超出庫(kù)存的購(gòu)買,這個(gè)就是處理的關(guān)鍵所以思路是第一步在秒殺類的先做一些基礎(chǔ)的數(shù)據(jù)生成:

//現(xiàn)在初始化里面定義后邊要使用的redis參數(shù)
public function _initialize(){
    parent::_initialize();
    $goods_id = I("goods_id",'0','intval');   
    if($goods_id){
      $this->goods_id = $goods_id;
      $this->user_queue_key = "goods_".$goods_id."_user";//當(dāng)前商品隊(duì)列的用戶情況
      $this->goods_number_key = "goods".$goods_id;//當(dāng)前商品的庫(kù)存隊(duì)列
    }
    $this->user_id = $this->user_id ? $this->user_id : $_SESSION['uid'];   
  }

2.4. 第二步就是關(guān)鍵所在,用戶在進(jìn)入商品詳情頁前先將當(dāng)前商品的庫(kù)存進(jìn)行隊(duì)列存入redis如下:

/**
  * 訪問產(chǎn)品前先將當(dāng)前產(chǎn)品庫(kù)存隊(duì)列
  * @access public
  * @author bieanju
  */
  public function _before_detail(){
    $where['goods_id'] = $this->goods_id;
    $where['start_time'] = array("lt",time());
    $where['end_time'] = array("gt",time());
    $goods = M("goods")->where($where)->field('goods_num,start_time,end_time')->find();
    !$goods && $this->error("當(dāng)前秒殺已結(jié)束!");
    if($goods['goods_num'] > $goods['order_num']){
      $redis = $this->connectRedis();
      $getUserRedis = $redis->hGetAll("{$this->user_queue_key}");
      $gnRedis = $redis->llen("{$this->goods_number_key}");
      /* 如果沒有會(huì)員進(jìn)來隊(duì)列庫(kù)存 */
      if(!count($getUserRedis) && !$gnRedis){      
        for ($i = 0; $i < $goods['goods_num']; $i ++) {
          $redis->lpush("{$this->goods_number_key}", 1);
        }
      }
      $resetRedis = $redis->llen("{$this->goods_number_key}");
      if(!$resetRedis){
        $this->error("系統(tǒng)繁忙,請(qǐng)稍后搶購(gòu)!");
      }
    }else{
      $this->error("當(dāng)前產(chǎn)品已經(jīng)秒殺完!");
    }
     
  }

接下來要做的就是用ajax來異步的處理用戶點(diǎn)擊購(gòu)買按鈕進(jìn)行符合條件的數(shù)據(jù)進(jìn)入購(gòu)買的排隊(duì)隊(duì)列(如果當(dāng)前用戶沒在當(dāng)前產(chǎn)品用戶的隊(duì)列就進(jìn)入排隊(duì)并且pop一個(gè)庫(kù)存隊(duì)列,如果在就拋出,):

/**
   * 搶購(gòu)商品前處理當(dāng)前會(huì)員是否進(jìn)入隊(duì)列
   * @access public
   * @author bieanju
   */
  public function goods_number_queue(){
    !$this->user_id && $this->ajaxReturn(array("status" => "-1","msg" => "請(qǐng)先登錄"));
    $model = M("flash_sale");
    $where['goods_id'] = $this->goods_id;
    $goods_info = $model->where($where)->find();
    !$goods_info && $this->error("對(duì)不起當(dāng)前商品不存在或已下架!"); 
    /* redis 隊(duì)列 */ 
    $redis = $this->connectRedis();
    /* 進(jìn)入隊(duì)列 */
    $goods_number_key = $redis->llen("{$this->goods_number_key}");
    if (!$redis->hGet("{$this->user_queue_key}", $this->user_id)) {
      $goods_number_key = $redis->lpop("{$this->goods_number_key}");
    }
     
    if($goods_number_key){
      // 判斷用戶是否已在隊(duì)列
      if (!$redis->hGet("{$this->user_queue_key}", $this->user_id)) {
        // 插入搶購(gòu)用戶信息
        $userinfo = array(
          "user_id" => $this->user_id,
          "create_time" => time()
        );        
        $redis->hSet("{$this->user_queue_key}", $this->user_id, serialize($userinfo));
        $this->ajaxReturn(array("status" => "1"));
      }else{
        $modelCart = M("cart");
        $condition['user_id'] = $this->user_id;
        $condition['goods_id'] = $this->goods_id;
        $condition['prom_type'] = 1;
    $cartlist = $modelCart->where($condition)->count();
        if($cartlist > 0){
          $this->ajaxReturn(array("status" => "2"));
        }else{
         
          $this->ajaxReturn(array("status" => "1"));
         
        }
         
      }
       
    }else{
      $this->ajaxReturn(array("status" => "-1","msg" => "系統(tǒng)繁忙,請(qǐng)重試!"));
    }
  }
【網(wǎng)站聲明】本站除付費(fèi)源碼經(jīng)過測(cè)試外,其他素材未做測(cè)試,不保證完整性,網(wǎng)站上部分源碼僅限學(xué)習(xí)交流,請(qǐng)勿用于商業(yè)用途。如損害你的權(quán)益請(qǐng)聯(lián)系客服QQ:2655101040 給予處理,謝謝支持。

相關(guān)文檔推薦

這篇文章主要介紹了PHP定義字符串的四種方式,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
下面小編就為大家分享一篇php 替換文章中的圖片路徑,下載圖片到本地服務(wù)器的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
下面小編就為大家分享一篇PHP給源代碼加密的幾種方法匯總(推薦),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
下面小編就為大家分享一篇php打開本地exe程序,js打開本地exe應(yīng)用程序,并傳遞相關(guān)參數(shù)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
這篇文章主要介紹了PHP類的反射來實(shí)現(xiàn)依賴注入過程以及相關(guān)知識(shí)點(diǎn)分享,對(duì)此有興趣的朋友跟著小編學(xué)習(xí)下吧。
php遍歷一個(gè)文件夾內(nèi)的所有文件和文件夾,并刪除所有文件夾和子文件夾下的所有文件的代碼,通過遞歸方式實(shí)現(xiàn)達(dá)到清空一個(gè)目錄的效果。本文給大家分享實(shí)例代碼,需要的朋友參考
主站蜘蛛池模板: 欧美一区二区在线观看 | 国产视频精品免费 | 国产人成精品一区二区三 | 欧美精品三区 | 日韩在线综合 | 欧美久久久 | 国产欧美精品一区二区 | 一区二区福利视频 | 欧美精品网站 | 久久亚洲一区 | 一级毛片免费看 | 国产成人精品一区二区三 | 亚洲午夜视频在线观看 | 99自拍视频 | 国产福利一区二区 | www.日韩高清 | 午夜视频一区二区 | 黄色成人在线观看 | 五月婷婷丁香婷婷 | 成人在线免费电影 | 浮生影院免费观看中文版 | 久久久www成人免费精品张筱雨 | 欧美在线观看一区二区 | 日本a∨精品中文字幕在线 亚洲91视频 | 亚洲色图综合 | 久久久久国产一区二区三区四区 | 亚洲视频一区 | 亚洲乱码一区二区三区在线观看 | 青青激情网 | 国产成人综合在线 | 91xxx在线观看 | 欧美日韩高清在线一区 | 毛片视频网站 | 国产成人精品一区 | 日韩在线第一 | 免费观看黄色一级片 | 草草在线观看 | 欧美性高潮 | 精品国产一区二区三区在线观看 | 亚洲视频不卡 | a精品视频 |