Fallanalyse der Verwendung von PHP + Redis zur Implementierung der Flash-Sale-Funktion des Einkaufszentrums (mit Code)

php中世界最好的语言
Freigeben: 2023-03-26 18:56:01
Original
2205 Leute haben es durchsucht

Dieses Mal bringe ich Ihnen eine Fallanalyse (mit Code) von PHP+Redis, die die Mall-Flash-Sale-Funktion implementiert Das Folgende ist ein praktischer Fall. 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. Der Standardport für die Redis-Installation ist 6379:

<?php
/* 数据库配置 */
return array(
  &#39;DATA_CACHE_PREFIX&#39; => '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认证密码 
);
?>
Nach dem Login kopieren

2.3 Der Vorteil des Flash-Sales besteht darin, dass er bei großen Parallelkäufen den Bestand nicht überschreitet. Dies ist der Schlüssel zur Verarbeitung. Daher besteht die Idee darin, im 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;
  }
Nach dem Login kopieren

2.4. Der zweite Schritt ist der Schlüssel, der Benutzer gibt die

Produktdetails

ein. Stellen Sie vor der Seite zunächst den aktuellen Produktbestand in die Warteschlange und speichern Sie ihn wie folgt in Redis:

//现在初始化里面定义后边要使用的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'];   
  }
Nach dem Login kopieren

Als nächstes müssen Sie Ajax verwenden, um den Klick des Benutzers auf die Kaufschaltfläche asynchron zu verarbeiten, um die berechtigten Daten für den Kauf in die Warteschlange zu stellen (wenn sich der aktuelle Benutzer nicht in der Warteschlange des aktuellen Produktbenutzers befindet, wird er in die Warteschlange gestellt Warteschlange und öffnen Sie eine Inventarwarteschlange. Wenn dies der Fall ist, wird sie ausgelöst):

/**
  * 访问产品前先将当前产品库存队列
  * @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[&#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("当前产品已经秒杀完!");
    }
     
  }
Nach dem Login kopieren

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['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" => "系统繁忙,请重试!"));
    }
  }
Wenn Sie hier ankommen, wird der Kern von Der Flash-Sale 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. OK, starten wir das Programm und verwenden es wie folgt:

Wenn ich es ausführe, antwortet Redis überhaupt nicht, nämlich den Redis-Dienst zu starten Befolgen Sie Ihre eigenen Anweisungen. Klicken Sie im nächsten redisbin_x32- oder redisbin_x64-Redis-Dienstverwaltungstool auf redis-server.exe, ok. Jetzt ist alles wie unten gezeigt abgeschlossen:

I Ich glaube, Sie haben es gemeistert, nachdem Sie den Fall in diesem Artikel gelesen haben. Weitere spannende Methoden finden Sie in anderen verwandten Artikeln auf der chinesischen PHP-Website!

Empfohlene Lektüre:

Fall-Nutzungsanalyse der RSA-Verschlüsselung, Entschlüsselung und Entwicklungsschnittstelle von PHP

Nutzungsfall-Analyse von PHP für lange Verbindungen

Das obige ist der detaillierte Inhalt vonFallanalyse der Verwendung von PHP + Redis zur Implementierung der Flash-Sale-Funktion des Einkaufszentrums (mit Code). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!