Heim  >  Artikel  >  Backend-Entwicklung  >  Code implementiert durch Kombination von thinkphp mit redis und queue

Code implementiert durch Kombination von thinkphp mit redis und queue

不言
不言Original
2018-06-07 15:08:313012Durchsuche

Dieser Artikel stellt hauptsächlich den Implementierungscode von thinkphp+redis+queue vor. Ich werde ihn jetzt mit Ihnen teilen und als Referenz verwenden. Lassen Sie uns dem Editor folgen und einen Blick darauf werfen.

1. Installieren Sie Redis und installieren Sie die entsprechende Redis-Erweiterung entsprechend Ihrer PHP-Version (dieser Schritt wird kurz beschrieben). php_redis.dll-Erweiterung Hier müssen Sie auf Ihre PHP-Version achten, wie in der Abbildung gezeigt:

 

1.2, fügen Sie extension=php_igbinary.dll;extension=php_redis.dll hinzu die php.ini-Datei.

ok Der erste Schritt der Redis-Umgebungskonstruktion ist abgeschlossen.

Redis ist tatsächlich im Projekt verwendet

2.1 Der erste Schritt besteht darin, die Redis-Parameter wie folgt zu konfigurieren:

<?php
/* 数据库配置 */
return array(
 &#39;DATA_CACHE_PREFIX&#39; => &#39;Redis_&#39;,//缓存前缀
 &#39;DATA_CACHE_TYPE&#39;=>&#39;Redis&#39;,//默认动态缓存为Redis
 &#39;DATA_CACHE_TIMEOUT&#39; => false,
 &#39;REDIS_RW_SEPARATE&#39; => true, //Redis读写分离 true 开启
 &#39;REDIS_HOST&#39;=>&#39;127.0.0.1&#39;, //redis服务器ip,多台用逗号隔开;读写分离开启时,第一台负责写,其它[随机]负责读;
 &#39;REDIS_PORT&#39;=>&#39;6379&#39;,//端口号
 &#39;REDIS_TIMEOUT&#39;=>&#39;300&#39;,//超时时间
 &#39;REDIS_PERSISTENT&#39;=>false,//是否长连接 false=短连接
 &#39;REDIS_AUTH&#39;=>&#39;&#39;,//AUTH认证密码 
);
?>

2.2 Die eigentliche Funktion:

/**
  * 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, der Kern des Flash-Verkaufs. Das Problem besteht darin, dass bei großer Parallelität der Kauf den Lagerbestand nicht überschreitet. Dies ist der Schlüssel zur Verarbeitung Der erste Schritt besteht darin, einige grundlegende Daten in der Flash-Sale-Kategorie zu generieren:

//现在初始化里面定义后边要使用的redis参数
public function _initialize(){
  parent::_initialize();
  $goods_id = I("goods_id",&#39;0&#39;,&#39;intval&#39;);  
  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[&#39;uid&#39;];  
 }

2.4, der zweite Schritt Dies ist der entscheidende Punkt. Bevor der Benutzer die Produktdetailseite aufruft, stellt er zunächst den Bestand des aktuellen Produkts in die Warteschlange und speichert es wie folgt in Redis:

 /**
 * 访问产品前先将当前产品库存队列
 * @access public
 * @author bieanju
 */
 public function _before_detail(){
  $where[&#39;goods_id&#39;] = $this->goods_id;
  $where[&#39;start_time&#39;] = array("lt",time());
  $where[&#39;end_time&#39;] = array("gt",time());
  $goods = M("goods")->where($where)->field(&#39;goods_num,start_time,end_time&#39;)->find();
  !$goods && $this->error("当前秒杀已结束!");
  if($goods[&#39;goods_num&#39;] > $goods[&#39;order_num&#39;]){
   $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[&#39;goods_num&#39;]; $i ++) {
     $redis->lpush("{$this->goods_number_key}", 1);
    }
   }
   $resetRedis = $redis->llen("{$this->goods_number_key}");
   if(!$resetRedis){
    $this->error("系统繁忙,请稍后抢购!");
   }
  }else{
   $this->error("当前产品已经秒杀完!");
  }
   
 }

Als nächstes müssen Sie Ajax verwenden, um den Klick des Benutzers auf die Kaufschaltfläche asynchron zu verarbeiten, um die Bedingungen zu erfüllen. Die Daten gelangen in die Kaufwarteschlange (sofern der aktuelle Benutzer Befindet sich nicht in der Warteschlange des aktuellen Produktbenutzers, tritt es in die Warteschlange ein und öffnet eine Inventarwarteschlange. Wenn dies der Fall ist, wird Folgendes ausgelöst:

/**
  * 抢购商品前处理当前会员是否进入队列
  * @access public
  * @author bieanju
  */
 public function goods_number_queue(){
  !$this->user_id && $this->ajaxReturn(array("status" => "-1","msg" => "请先登录"));
  $model = M("flash_sale");
  $where[&#39;goods_id&#39;] = $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[&#39;user_id&#39;] = $this->user_id;
    $condition[&#39;goods_id&#39;] = $this->goods_id;
    $condition[&#39;prom_type&#39;] = 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" => "系统繁忙,请重试!"));
  }
 }

Hängen Sie eine Debugging-Funktion an, um den angegebenen Warteschlangenwert zu löschen:

 public function clearRedis(){
   set_time_limit(0);
   $redis = $this->connectRedis();
   //$Rd = $redis->del("{$this->user_queue_key}");
   $Rd = $redis->hDel("goods49",&#39;用户id&#39;&#39;);
   $a = $redis->hGet("goods_49_user", &#39;用户id&#39;);
   if(!$a){
    dump($a);
   }
   
   if($Rd == 0){
    exit("Redis队列已释放!");   
   }
  }

Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, er wird für das Lernen aller hilfreich sein. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website.

Verwandte Empfehlungen:

ThinkPHP und Ajax realisieren das Dropdown-Menü der sekundären Verknüpfung


Über die URL-Routing-Regeln in thinkphp Mit statischen Einstellungen

Das obige ist der detaillierte Inhalt vonCode implementiert durch Kombination von thinkphp mit redis und queue. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn