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

php+redis實現商城秒殺功能

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

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

1、安裝redis,根據自己的php版本安裝對應的redis擴展(此步驟簡單的描述一下)

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

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

ok此處已經完成第一步redis環境搭建完成看看phpinfo

2、項目中實際使用redis

2.1.第一步配置redis參數如下,redis安裝的默認端口為6379: 

<?php
/* 數據庫配置 */
return array(
  'DATA_CACHE_PREFIX' => 'Redis_',//緩存前綴
  'DATA_CACHE_TYPE'=>'Redis',//默認動態緩存為Redis
  'DATA_CACHE_TIMEOUT' => false,
  'REDIS_RW_SEPARATE' => true, //Redis讀寫分離 true 開啟
  'REDIS_HOST'=>'127.0.0.1', //redis服務器ip,多臺用逗號隔開;讀寫分離開啟時,第一臺負責寫,其它[隨機]負責讀;
  'REDIS_PORT'=>'6379',//端口號
  'REDIS_TIMEOUT'=>'300',//超時時間
  'REDIS_PERSISTENT'=>false,//是否長連接 false=短連接
  'REDIS_AUTH'=>'',//AUTH認證密碼 
);
?>

2.2.實際函數中使用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. 秒殺的核心問題是在大并發的情況下不會超出庫存的購買,這個就是處理的關鍵所以思路是第一步在秒殺類的先做一些基礎的數據生成:

//現在初始化里面定義后邊要使用的redis參數
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";//當前商品隊列的用戶情況
      $this->goods_number_key = "goods".$goods_id;//當前商品的庫存隊列
    }
    $this->user_id = $this->user_id ? $this->user_id : $_SESSION['uid'];   
  }

2.4. 第二步就是關鍵所在,用戶在進入商品詳情頁前先將當前商品的庫存進行隊列存入redis如下:

/**
  * 訪問產品前先將當前產品庫存隊列
  * @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("當前秒殺已結束!");
    if($goods['goods_num'] > $goods['order_num']){
      $redis = $this->connectRedis();
      $getUserRedis = $redis->hGetAll("{$this->user_queue_key}");
      $gnRedis = $redis->llen("{$this->goods_number_key}");
      /* 如果沒有會員進來隊列庫存 */
      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("系統繁忙,請稍后搶購!");
      }
    }else{
      $this->error("當前產品已經秒殺完!");
    }
     
  }

接下來要做的就是用ajax來異步的處理用戶點擊購買按鈕進行符合條件的數據進入購買的排隊隊列(如果當前用戶沒在當前產品用戶的隊列就進入排隊并且pop一個庫存隊列,如果在就拋出,):

/**
   * 搶購商品前處理當前會員是否進入隊列
   * @access public
   * @author bieanju
   */
  public function goods_number_queue(){
    !$this->user_id && $this->ajaxReturn(array("status" => "-1","msg" => "請先登錄"));
    $model = M("flash_sale");
    $where['goods_id'] = $this->goods_id;
    $goods_info = $model->where($where)->find();
    !$goods_info && $this->error("對不起當前商品不存在或已下架!"); 
    /* redis 隊列 */ 
    $redis = $this->connectRedis();
    /* 進入隊列 */
    $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){
      // 判斷用戶是否已在隊列
      if (!$redis->hGet("{$this->user_queue_key}", $this->user_id)) {
        // 插入搶購用戶信息
        $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" => "系統繁忙,請重試!"));
    }
  }
【網站聲明】本站除付費源碼經過測試外,其他素材未做測試,不保證完整性,網站上部分源碼僅限學習交流,請勿用于商業用途。如損害你的權益請聯系客服QQ:2655101040 給予處理,謝謝支持。

相關文檔推薦

這篇文章主要介紹了PHP定義字符串的四種方式,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
下面小編就為大家分享一篇php 替換文章中的圖片路徑,下載圖片到本地服務器的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
下面小編就為大家分享一篇PHP給源代碼加密的幾種方法匯總(推薦),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
下面小編就為大家分享一篇php打開本地exe程序,js打開本地exe應用程序,并傳遞相關參數方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
這篇文章主要介紹了PHP類的反射來實現依賴注入過程以及相關知識點分享,對此有興趣的朋友跟著小編學習下吧。
php遍歷一個文件夾內的所有文件和文件夾,并刪除所有文件夾和子文件夾下的所有文件的代碼,通過遞歸方式實現達到清空一個目錄的效果。本文給大家分享實例代碼,需要的朋友參考
主站蜘蛛池模板: 久久久国产一区二区三区 | 亚洲欧美中文日韩在线v日本 | 第一av | 国产精品久久久久久久久图文区 | 综合天天久久 | 91大神在线资源观看无广告 | 999视频| 自拍偷拍欧美 | 丝袜 亚洲 另类 欧美 综合 | 精品一区二区三区四区在线 | 91国产精品| 亚洲精品一二三区 | 中文字幕亚洲欧美 | www.一区二区| 亚洲欧洲在线观看视频 | 成人在线免费观看 | 欧美极品在线观看 | 国产精品久久在线 | 欧美v日韩| 一区二区三区av夏目彩春 | 91大神xh98xh系列全部 | 久久中文字幕一区 | 成人精品区 | 午夜小视频免费观看 | 欧美成人精品在线观看 | 99这里只有精品视频 | 久久久久久看片 | 超碰免费观看 | 国产激情视频在线 | 国产精品久久国产精品 | 国产98色在线 | 日韩 | 国产三级精品视频 | 一区二区不卡视频 | 国产剧情一区 | 三级成人片 | 国产午夜精品久久久久免费视高清 | 鸡毛片| 国产综合久久久久久鬼色 | 欧美福利在线 | 国产www.| 久久最新精品 |