今回は、モールフラッシュセール機能を実装するための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( 'DATA_CACHE_PREFIX' => '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['goods_num']; $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+redisを利用してモールのフラッシュセール機能を実装した事例分析(コード付き)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。