久久久久久久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方法 源碼全面解析,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
主站蜘蛛池模板: 亚洲精品免费视频 | 激情久久av一区av二区av三区 | 瑞克和莫蒂第五季在线观看 | 日韩视频福利 | 美女黄视频网站 | 香蕉av免费 | 欧美中文字幕在线观看 | 一区二区中文字幕 | 欧美一卡二卡在线 | 看av片网站| 欧美成人一区二区三区 | 视频在线观看一区二区 | 91中文字幕在线观看 | 欧美一页 | 日韩综合在线播放 | 视频在线观看亚洲 | 蜜桃av人人夜夜澡人人爽 | 手机av免费在线 | 成人免费毛片在线观看 | 国产成人小视频 | 精品国产乱码久久久久久闺蜜 | 欧美一级做a爰片免费视频 国产美女特级嫩嫩嫩bbb片 | 国产人久久人人人人爽 | 亚洲精品久久久一区二区三区 | 日韩精品一区二区三区中文字幕 | 91在线精品一区二区 | www.玖玖玖 | 国产欧美日韩一区二区三区在线 | 中文字幕中文字幕 | 亚洲一区视频在线 | 欧美在线一区二区三区 | 亚洲欧美视频一区 | 天天干天天干 | 精品一区二区三区在线观看国产 | 国产日韩欧美二区 | 一区二区三区四区在线视频 | 一区二区在线免费观看视频 | 91久久精品一区二区二区 | 97av在线| 国产精品久久久久久52avav | 日本人做爰大片免费观看一老师 |