Maison  >  Article  >  développement back-end  >  PHP et Redis réalisent le partage de code de fonction de vente flash dans les centres commerciaux

PHP et Redis réalisent le partage de code de fonction de vente flash dans les centres commerciaux

小云云
小云云original
2018-02-09 09:18:344710parcourir

Cet article présente principalement php+redis pour réaliser la fonction de vente flash du centre commercial. Il a une certaine valeur de référence. Les amis intéressés peuvent s'y référer.

1. Installez redis et installez l'extension redis correspondante en fonction de votre propre version de PHP (décrivez brièvement cette étape)

1.1. Installez php_igbinary.dll, l'extension php_redis.dll nécessite votre attention ici. La version de php est la suivante :

Le fichier 1.2.php.ini ajoute extension=php_igbinary.dll;extension=php_redis.dll deux extensions

ok Le la première étape de configuration de l'environnement redis est terminée. Jetez un œil à phpinfo

2.1. La première étape consiste à configurer redis. Les paramètres sont les suivants, le port par défaut pour l'installation de redis est 6379 :


2.2. Utilisez redis dans la fonction réelle : <.>
<?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. L'enjeu central des ventes flash est de ne pas dépasser l'achat de stock en cas de forte concurrence. C'est la clé du traitement, donc l'idée est. pour générer quelques données de base dans la catégorie des ventes flash comme première étape :

/**
    * 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. l'utilisateur met d'abord en file d'attente l'inventaire du produit actuel et le stocke dans Redis comme suit :

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


La prochaine chose à faire est d'utiliser ajax pour traiter de manière asynchrone le produit de l'utilisateur. cliquez sur le bouton d'achat pour saisir les données de qualification dans la file d'attente d'achat (si l'utilisateur actuel n'est pas dans la file d'attente de l'utilisateur actuel du produit. Entrez simplement dans la file d'attente et ouvrez une file d'attente d'inventaire, et lancez-la si elle est là) :

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


Attacher une fonction de débogage pour supprimer la valeur de file d'attente spécifiée :

/**
   * 抢购商品前处理当前会员是否进入队列
   * @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" => "系统繁忙,请重试!"));
    }
  }


Quand vous arrivez ici , le cœur de la vente flash est pratiquement terminé. Les détails doivent encore être améliorés par vous-même, comme le traitement du panier et le traitement des commandes, d'accord. Commencez à exécuter le programme et utilisez le propre ab d'Apache pour effectuer une simple simulation. test de simultanéité comme suit :

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队列已释放!");      
     }
   }

Lorsque je commence à exécuter, redis ne répond pas du tout. À ce stade, il y a une étape de moins. service redis. Veuillez utiliser l'outil de gestion de service redisbin_x32 ou redisbin_x64 en fonction de votre système, cliquez sur redis-server.exe, ok, puis tout est terminé comme indiqué ci-dessous :

Recommandations associées :


Exemple de partage de scripts JS pour réaliser des ventes flash automatiques sur des pages Web

Exemple d'analyse du framework Yii redis+php pour réaliser des ventes flash

Vente flash dans les centres commerciaux pour éviter les stocks survendus

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn