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( '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.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; }
2.4. Der zweite Schritt ist der Schlüssel, der Benutzer gibt die
Produktdetailsein. 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']; }
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['goods_num']; $i ++) { $redis->lpush("{$this->goods_number_key}", 1); } } $resetRedis = $redis->llen("{$this->goods_number_key}"); if(!$resetRedis){ $this->error("系统繁忙,请稍后抢购!"); } }else{ $this->error("当前产品已经秒杀完!"); } }
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" => "系统繁忙,请重试!"));
}
}
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!