redis 简单使用队列

小白 2020-12-10 原创文章


tp5.1+rdis+720 秒杀并发处理



    不啰嗦 简单上代码

    

/**
 * 访问产品前先将当前产品库存队列
 * @access public
 * @author bieanju
 */
public  function  _before_detail(){
    $where [ 'goods_id' ] =  1;
    $where [ 'start_time' ] =  array ( "lt" ,time());
    $where [ 'end_time' ] =   array ( "gt" ,time());
    $goods  = db( "goods" )->where( $where )->field( 'goods_num,start_time,end_time' )->find();
    if(!$goods){
        return '当前秒杀已结束';
    }
    if ( $goods [ 'goods_num' ] >  0){
        $redis =  new Redis();
        $user_queue_key = 'user_list_key';//用户抢购列表key
        $goods_number_key = 'goods_number_key';//商品列表key
        //获取秒杀购买用户数量
        $getUserRedis  =  $redis ->hGetAll($user_queue_key);
        //获取商品队列
        $gnRedis  =  $redis ->llen($goods_number_key);
        /* 如果没有会员进来 商品队列空 则 把商品加入redis列表中 */
        if (! count ( $getUserRedis ) && ! $gnRedis ){
            //商品加入redis列表中
            for  ( $i  = 0;  $i  <  $goods [ 'goods_num' ];  $i  ++) {
                $redis ->lpush($goods_number_key , $i);
            }
        }
        $resetRedis  =  $redis ->llen($goods_number_key);
        //如果商品还没加入,报下面错误
        if (! $resetRedis ){
            $this ->error( "系统繁忙,请稍后抢购!" );
        }
    } else {
        $this ->error( "当前产品已经秒杀完!" );
    }
}


/**
 * 抢购商品前处理当前会员是否进入队列
 * @access public
 * @author bieanju
 */
public  function  goods_number_queue(){
    $user_queue_key = 'user_list_key';//用户抢购列表key
    $goods_number_key = 'goods_number_key';//商品列表key
    //传入条件
    $where[] = ['id','=',1];
    $goods_info  =  db('商品库') ->where( $where )->find();
    if(! $goods_info){
        return '对不起当前商品不存在或已下架';
    }
    /* redis 队列 */
    $redis =  new Redis();
    /* 进入队列  */
    $goods_number_key  =  $redis ->llen($goods_number_key);
    //去查秒杀记录改用户是否有
    if  (! $redis ->hGet($user_queue_key,session('uid'))) {
        //没有减去商品队列--1
        $goods_number_key  =  $redis ->lpop($goods_number_key);
    }

    if ( $goods_number_key ){
        // 判断用户是否已在队列
        if  (! $redis ->hGet($user_queue_key,session('uid'))) {
            // 插入抢购用户信息
            $userinfo  =  array (
                "user_id"  =>  $this ->user_id,
                "create_time"  => time()
            );
            $redis ->hSet( $user_queue_key,  session('uid'), serialize( $userinfo ));
            return '秒杀成功';
        } else {
            //查询订单表
            $cartlist  =  db('订单表') ->where(['uid'=>session('uid')])-> count ();
            if ( $cartlist  > 0){
                return '秒杀成功';
            } else {
                return '秒杀失败';
            }
        }
    } else {
        return '系统繁忙,请重试';
    }
}


    上面是简单的demo

    多用户排列,反之,把用户加入队列,后台程序去跑调用用户,当数量达到一定或固定数量,就关闭redis或者清理状态,用户排队界面直接抛出  已抢完 等提示

站点信息