Home  >  Article  >  Backend Development  >  Example code of Thinkphp and redis+queue implementation (picture)

Example code of Thinkphp and redis+queue implementation (picture)

黄舟
黄舟Original
2017-08-22 09:26:062250browse

This article mainly introduces the implementation code of thinkphp+redis+queue. The editor thinks it is quite good. Now I will share it with you and give it as a reference. Let’s follow the editor to take a look.

1. Install Redis and install the corresponding redis extension according to your PHP version (this step is briefly described)

1.1. Install php_igbinary.dll. php_redis.dll extension Here you need to pay attention to your php version as shown in the figure:

 

1.2, add extension=php_igbinary.dll; extension=php_redis.dll to the php.ini file Extension

ok The first step of redis environment construction has been completed. Take a look at phpinfo

The actual use of redis in the project

2.1. The first step is to configure the redis parameters as follows. The default port for redis installation is 6379:


<?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.2. Use redis in the actual function:


/**
  * 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. The core problem of flash sales is that the purchase of inventory will not exceed the inventory in the case of large concurrency. This is the key to processing, so the idea is to take the first step in the flash sale category. First do some basic data generation:


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

2.4. The second step is the key. The user first queues up the inventory of the current product before entering the product details page. Enter redis as follows:


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

The next thing to do is to use ajax to asynchronously process the user's click on the purchase button to enter the qualifying data into the purchase queue ( If the current user is not in the queue of the current product user, enter the queue and pop an inventory queue. If it is, throw it out,):


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

Attach a debugging Function to delete the specified queue value:


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

The above is the detailed content of Example code of Thinkphp and redis+queue implementation (picture). For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn