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

詳解thinkphp+redis+隊列的實現代碼

本篇文章主要介紹了thinkphp+redis+隊列的實現代碼,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

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

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

詳解thinkphp+redis+隊列的實現代碼  

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

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

詳解thinkphp+redis+隊列的實現代碼

項目中實際使用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 給予處理,謝謝支持。

相關文檔推薦

下面小編就為大家分享一篇ThinkPHP整合datatables實現服務端分頁的示例代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
這篇文章主要介紹了PHP使用Redis長連接的方法,結合實例形式詳細分析php操作redis長連接的使用方法及相關注意事項,需要的朋友可以參考下
這篇文章主要為大家詳細介紹了php+redis消息隊列搶購實現代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
這篇文章主要為大家詳細介紹了php+redis實現商城秒殺功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
這篇文章主要介紹了PHP基于redis計數器類定義與用法,結合實例形式較為詳細的分析了php定義的redis計數器類及其相關使用技巧,需要的朋友可以參考下
下面小編就為大家分享一篇thinkphp3.2.0 setInc方法 源碼全面解析,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
主站蜘蛛池模板: 91pao对白在线播放 | 久久久xx | 欧美a级成人淫片免费看 | 不卡一区二区三区四区 | 日本a级大片 | 免费在线视频精品 | 天天干天天玩天天操 | 91av久久久 | 黄色片a级 | 国产成人午夜精品影院游乐网 | 成人在线视频一区 | 国产欧美日韩二区 | 狠狠爱网址| 国产精品免费大片 | 天天操天天插 | 国产 日韩 欧美 制服 另类 | 国产精品欧美一区二区三区不卡 | 九九亚洲 | 国产一级片免费在线观看 | 日本在线视频一区二区 | 91一区二区三区在线观看 | 精品一二三区视频 | 一区二区高清不卡 | 久久久久久久91 | 美国一级片在线观看 | 日韩一区二区在线观看 | 国产激情在线 | 成人在线一区二区 | 亚洲视频区| 久久久久久一区 | 丁香婷婷综合激情五月色 | 欧美精品久久久 | 久久高清亚洲 | 二区三区在线观看 | 日韩欧美视频在线 | 天天干干 | 91社区在线高清 | 国内自拍偷拍 | 日韩在线精品强乱中文字幕 | 欧美日韩国产一区二区 | 在线成人福利 |