ホームページ  >  記事  >  バックエンド開発  >  php+redisを利用してモールのフラッシュセール機能を実装した事例分析(コード付き)

php+redisを利用してモールのフラッシュセール機能を実装した事例分析(コード付き)

php中世界最好的语言
php中世界最好的语言オリジナル
2018-05-19 10:03:062215ブラウズ

今回は、モールフラッシュセール機能を実装するためのphp+redisの事例分析(コード付き)をお届けします。 モールフラッシュセール機能を実装するためのphp+redisの注意点は次のとおりです。 、見てみましょう。

1. redis をインストールし、独自の php バージョンに応じて対応する redis 拡張機能をインストールします (この手順について簡単に説明します)

1.1. ここでは、php_igbinary.dll、php_redis.dll 拡張機能をインストールします。図内:

1.2.php.ini ファイルには 2 つの新しい拡張子があります: extension=php_igbinary.dll;extension=php_redis.dll

ok ここで、redis 環境を構築するための最初のステップが完了しました。 phpinfo

2. プロジェクトでの redis の実際の使用方法

2.1。最初のステップは、redis インストールのデフォルトのポートは 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认证密码 
);
?>
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. 2 番目のステップが重要で、ユーザーは

製品の詳細を入力します まず現在の製品在庫をキューに入れ、ページの前に 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[&#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("当前产品已经秒杀完!");
    }
     
  }
次のやるべきことは、Ajax を使用してユーザーの購入ボタンのクリックを非同期的に処理し、対象となるデータを購入キューに入力することです (現在のユーザーが現在の製品ユーザーのキューに入り、在庫キューをポップしない場合)。そこに、それを捨ててください):

/**
   * 抢购商品前处理当前会员是否进入队列
   * @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" => "系统繁忙,请重试!"));
    }
  }
指定されたキュー値を削除するデバッグ関数をアタッチします:

public function clearRedis(){
     set_time_limit(0);
     $redis = $this->connectRedis();
     //$Rd = $redis->del("{$this->user_queue_key}");
     $Rd = $redis->hDel("goods49",'用户id'');
     $a = $redis->hGet("goods_49_user", '用户id');
     if(!$a){
       dump($a);
     }
     
     if($Rd == 0){
       exit("Redis队列已释放!");      
     }
   }
ここまで来たら、フラッシュ セールの核心はこれだけです。ショッピング カートの処理と注文の処理を開始しましょう。Apache 独自の ab を使用して、次のように簡単な同時実行テストを実行できます。

実行すると、redis からの応答がありません。この時点では、redis サービスを開くという重要な手順が 1 つあります。システムに応じて redisbin_x32 または redisbin_x64 redis サービス管理ツールを使用し、redis-server.exe をクリックすると、すべてが完了します。以下に示すように:

この記事の事例を読んだ後は、この方法を習得したと思います。さらに興味深い情報については、php 中国語 Web サイトの他の関連記事に注目してください。

推奨書籍:

PHP の RSA 暗号化、復号化、および開発インターフェイスの使用例分析

PHP の長時間接続の使用例分析

以上がphp+redisを利用してモールのフラッシュセール機能を実装した事例分析(コード付き)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。