이번에는 쇼핑몰 플래시 세일 기능을 구현하기 위한 php+redis 사례 분석(코드 포함)을 가져오겠습니다. php+redis에서 쇼핑몰 플래시 세일 기능을 구현하기 위한 notes는 무엇입니까? 다음은 실제 사례입니다. , 살펴 보겠습니다.
1. Redis를 설치하고 자신의 PHP 버전에 따라 해당 Redis 확장을 설치합니다(이 단계를 간략하게 설명).
1.1 여기에서 표시된 대로 php_igbinary.dll, php_redis.dll 확장을 설치해야 합니다. 그림에서:
1.2.php.ini 파일에는 두 개의 새로운 확장자가 있습니다: 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连接 * @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. 두 번째 단계가 핵심입니다. 사용자는 페이지 앞에 제품 세부정보 를 입력하고 다음과 같이 현재 제품 재고를 대기열에 추가하고 Redis에 저장합니다. 다음으로 해야 할 일은 Ajax를 사용하여 사용자의 구매 버튼 클릭을 비동기적으로 처리하여 구매 대기열에 적격 데이터를 입력하는 것입니다(현재 사용자가 현재 제품 사용자의 대기열에 들어가고 인벤토리 대기열을 팝업하지 않는 경우). 거기에 있으니 버리세요,):
/** * 访问产品前先将当前产品库存队列 * @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("当前产品已经秒杀完!"); } }
지정된 대기열 값을 삭제하는 디버깅 기능을 첨부하세요:
/** * 抢购商品前处理当前会员是否进入队列 * @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" => "系统繁忙,请重试!")); } }
여기서 플래시 세일의 핵심은 바로 그것입니다. 그런 세부 사항은 여전히 스스로 개선해야 합니다. 장바구니 처리 및 주문 처리를 시작하겠습니다. Apache 자체 ab를 사용하여 다음과 같이 간단한 시뮬레이션 동시성 테스트를 수행할 수 있습니다.
실행하면 Redis에서 응답이 없습니다. 지금은 redis 서비스를 여는 중요한 단계가 하나 빠져 있습니다. 시스템에 따라 redisbin_x32 또는 redisbin_x64 redis 서비스 관리 도구를 사용하고 redis-server.exe를 클릭하면 모든 것이 완료됩니다. 아래와 같이 완료되었습니다.
이 기사의 사례를 읽은 후 방법을 마스터했다고 믿습니다. 더 흥미로운 정보를 보려면 PHP 중국어 웹사이트의 다른 관련 기사를 주목하세요!
추천 자료:
PHP의 RSA 암호화, 복호화 및 개발 인터페이스 사례 사용 분석PHP 긴 연결 사용 사례 분석위 내용은 php+redis를 활용한 쇼핑몰 플래시 세일 기능 구현 사례 분석(코드 포함)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!