Heim  >  Artikel  >  Backend-Entwicklung  >  PHP und Redis realisieren Code-Sharing für Mall-Flash-Sale-Funktionen

PHP und Redis realisieren Code-Sharing für Mall-Flash-Sale-Funktionen

小云云
小云云Original
2018-02-09 09:18:344710Durchsuche

Dieser Artikel stellt hauptsächlich PHP+Redis vor, um die Flash-Sale-Funktion des Einkaufszentrums zu realisieren. Ich hoffe, dass er jedem helfen kann.

1. Installieren Sie Redis und installieren Sie die entsprechende Redis-Erweiterung entsprechend Ihrer eigenen PHP-Version (beschreiben Sie diesen Schritt kurz)

1.1. Installieren Sie php_igbinary.dll, die Erweiterung php_redis.dll benötigt hier Ihre Aufmerksamkeit Die PHP-Version ist wie folgt:

1.2.php.ini-Datei fügt extension=php_igbinary.dll;extension=php_redis.dll zwei Erweiterungen hinzu

ok Der erste Schritt zum Einrichten der Redis-Umgebung ist abgeschlossen. Schauen Sie sich phpinfo an

2.1. Der erste Schritt besteht darin, Redis zu konfigurieren. Die Parameter lauten wie folgt. Der Standardport für die Redis-Installation ist 6379:


2.2 Verwenden Sie Redis in der eigentlichen Funktion:
<?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.3 Das Kernproblem bei Flash-Verkäufen besteht darin, den Bestandskauf bei großer Parallelität nicht zu überschreiten. Dies ist der Schlüssel zur Verarbeitung, so die Idee Um als ersten Schritt einige grundlegende Daten in der Flash-Sale-Kategorie zu generieren:
/**
    * redis连接
    * @access private
    * @return resource
    * @author bieanju
    */
  private function connectRedis(){
    $redis=new \Redis();
    $redis->connect(C("REDIS_HOST"),C("REDIS_PORT"));    
    return $redis;
  }


2.4 Der zweite Schritt ist der Schlüssel. Der Benutzer stellt zunächst den Bestand des aktuellen Produkts in die Warteschlange und speichert ihn wie folgt in Redis:
//现在初始化里面定义后边要使用的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;];   
  }


Als nächstes müssen Sie Ajax verwenden, um die Bestände des Benutzers asynchron zu verarbeiten Klicken Sie auf die Kaufschaltfläche, um die qualifizierenden Daten in die Kaufwarteschlange einzugeben (wenn sich der aktuelle Benutzer nicht in der Warteschlange des aktuellen Produktbenutzers befindet, betreten Sie einfach die Warteschlange, öffnen Sie eine Inventarwarteschlange und werfen Sie sie, wenn sie vorhanden ist, aus):
/**
  * 访问产品前先将当前产品库存队列
  * @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("当前产品已经秒杀完!");
    }
     
  }


Fügen Sie eine Debugging-Funktion hinzu, um den angegebenen Warteschlangenwert zu löschen:
/**
   * 抢购商品前处理当前会员是否进入队列
   * @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" => "系统繁忙,请重试!"));
    }
  }


Wenn Sie hier ankommen Der Kern des Flash-Verkaufs ist im Grunde genommen abgeschlossen. Die Details müssen noch von Ihnen selbst verbessert werden, z. B. die Verarbeitung des Warenkorbs und die Verarbeitung von Bestellungen. Okay, starten Sie das Programm und verwenden Sie Apaches eigenen AB, um eine einfache Simulation durchzuführen Parallelitätstest wie folgt:
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队列已释放!");      
     }
   }

Wenn ich starte, reagiert Redis überhaupt nicht. Der erste Schritt ist die Aktivierung Redis-Dienst. Bitte wählen Sie das Redis-Dienstverwaltungstool von redisbin_x32 oder redisbin_x64 entsprechend Ihrem System aus, klicken Sie auf redis-server.exe, ok. Jetzt ist alles wie unten gezeigt abgeschlossen:

Verwandte Empfehlungen:


Beispielfreigabe von JS-Skripten zur Realisierung automatischer Flash-Verkäufe auf Webseiten

Instanzanalyse des Yii-Frameworks redis+php to Erzielen Sie Flash-Sales

Mall-Flash-Sale, um überverkauften Lagerbestand zu verhindern

Das obige ist der detaillierte Inhalt vonPHP und Redis realisieren Code-Sharing für Mall-Flash-Sale-Funktionen. 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