婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > php+redis實現商城秒殺功能

php+redis實現商城秒殺功能

熱門標簽:離石地圖標注 南寧高頻外呼回撥系統哪家好 400電話辦理福州市 江蘇外呼電銷機器人報價 電話機器人危險嗎 400電話申請方法收費 深圳外呼系統收費 專業電話機器人批發商 長沙crm外呼系統業務

好久沒來整理文章了,閑了沒事寫篇文章記錄下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" => "系統繁忙,請重試!"));
  }
 }

附加一個調試的函數,刪除指定隊列值:

public function clearRedis(){
   set_time_limit(0);
   $redis = $this->connectRedis();
   //$Rd = $redis->del("{$this->user_queue_key}");
   $Rd = $redis->hDel("goods49",'用戶id'');
   $a = $redis->hGet("goods_49_user", '用戶id');
   if(!$a){
    dump($a);
   }
   
   if($Rd == 0){
    exit("Redis隊列已釋放!");   
   }
}

走到此處的時候秒殺的核心基本就完了,細節還需要自己在去完善,像購物車這邊的處理還有訂單的處理,好吧開始跑程序利用apache自身的ab可以進行簡單的模擬并發測試如下:

跑起來,我擦跑步起來redis沒有任何反應,此時還少一步重要的步驟就是開啟redis服務,請根據自己的系統下一個redisbin_x32或者redisbin_x64的redis服務管理工具,點擊redis-server.exe,ok至此全部完成如下圖:

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • php結合redis實現高并發下的搶購、秒殺功能的實例
  • Redis瞬時高并發秒殺方案總結
  • redis使用watch秒殺搶購實現思路
  • 基于redis分布式鎖實現秒殺功能
  • php和redis實現秒殺活動的流程
  • Redis使用watch完成秒殺搶購功能的代碼
  • Java使用Redis實現秒殺功能
  • 使用Redis實現秒殺功能的簡單方法

標簽:白酒營銷 濱州 南昌 株洲 南京 興安盟 太原 曲靖

巨人網絡通訊聲明:本文標題《php+redis實現商城秒殺功能》,本文關鍵詞  php+redis,實現,商城,秒殺,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《php+redis實現商城秒殺功能》相關的同類信息!
  • 本頁收集關于php+redis實現商城秒殺功能的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 蕉岭县| 英吉沙县| 松桃| 石屏县| 武宁县| 罗山县| 荣成市| 咸宁市| 城口县| 宿州市| 云安县| 富平县| 邢台市| 恩施市| 高州市| 贡觉县| 九寨沟县| 台北市| 五大连池市| 太康县| 邹城市| 平罗县| 灵丘县| 中西区| 巴彦县| 九江市| 建德市| 玛沁县| 中江县| 黄石市| 喀什市| 内乡县| 芮城县| 雷山县| 邵东县| 唐山市| 托克托县| 珲春市| 响水县| 天门市| 平乡县|