redis消息队列

// 初始化redis数据列表 模拟库存50,redis搭建在centos中已开启
public function redisinit(){
    $store=50; // 库存50
    $redis=$this->redis(); //接入redis
    $redis->del('goods_store'); // 删除库存列表
    $res=$redis->llen('goods_store'); //返回库存长度,这里已经是0
    $count=$store-$res;
    for($i=0;$i<$count;$i++){
        $redis->lpush('goods_store',1); //列表推进50个,模拟50个商品库存
    }
}

// 秒杀入口
public function kills(){
    $id = input("id"); //商品编号
    if(!$id)
        return $this->insertlog(0);//记录失败日志
    $redis = $this->redis(); // 接入redis
    $count=$redis->lpop('goods_store'); //减少库存,返回剩余库存数
    if(!$count){ //库存为0
       $this->insertlog(0); //记录秒杀失败的 日志
        return false;
    }else{// 有库存
        $ordersn = $this->build_order_no(); //订单号随机生成
        $uid = rand(0,9999); //用户id随机生成,正式项目可以启用登录的session
        $status = 1; // 订单状态
        $data = Db::name("ab_goods")->field("count,amount")->where("id",$id)->find();//查找商品
        if(!$data)
           return $this->insertlog(0); //商品不存在
        $result = Db::name("ab_order")->insert(["order_sn"=>$ordersn,"user_id"=>$uid,"goods_id"=>$id,"price"=>$data['amount'],"status"=>$status,'addtime'=>date('Y-m-d H:i:s')]); //订单入库
        $res = Db::name("ab_goods")->where("id",$id)->setDec("count"); //库存减少
        if($res){
            $this->insertlog(); //记录成功的日志
        }else{
            $this->insertlog(0);//记录失败的日志
        }
    }
}        
 
//生成唯一订单
function build_order_no(){
    return date('ymd').substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8);
}
 
// 记录日志 状态1成功 0失败
function insertlog($status=1){
    return Db::name("ab_log")->insertGetId(["count"=>1,"status"=>$status,"addtime"=>date('Y-m-d H:i:s')]);
}

 

posted @ 2020-11-17 14:22  潘潘潘的博客  阅读(92)  评论(0编辑  收藏  举报