PHP简单实现秒杀 ,队列

<?php

namespace app\index\controller;


/**
 * 秒杀
 * @internal
 */
class Skill //extends Backend
{

    protected $redis = '';

    public function __construct()
    {
        $this->redis = new \Redis();
        $this->redis->connect('127.0.0.1', 6379);
    }

    public function __destruct()
    {
        $this->redis->close();
    }

    /**
     * 生成商品库存redis
     */
    public function goodsRedis()
    {
        //商品信息 id商品id stock商品库存
        $data = input();
        foreach ($data as $k => $v) {
            $redis_key = 'goods_id_' . $v['id'];
            for ($i = 0; $i < $v['stock']; $i++) {
                //插入redis中商品的表抢购时从这读取
                $this->redis->lPush($redis_key, 1);
            }
        }
        echo "完成";
        die;
    }



    /**
     * 抢购
     */
    public function skill()
    {
        $data = input();
        //模拟随机用户id
        $uid = rand(10000,99999);
        //传商品id
        $redis_key = 'goods_id_' .  $data['id'];
        //查询redis中商品的数量长度
        $len = $this->redis->lLen($redis_key);
        $str = "";
        if(!$len || $len<=0){
            $str .= $uid."抢购失败,商品售罄";
        }else{
            $redis_user_name = "goods_id_".$data['id']."_uid";
            //判断已抢购列表中是否已存在该用户,获取列表中所有的数据
            $skill_user_list = $this->redis->lrange($redis_user_name, 0, -1);
            if(in_array($uid, $skill_user_list)){
                $str .= $uid."已经抢购成功";
            }else{
                //从redis商品表中取出一个
                $this->redis->rPop($redis_key);
                //插入用户抢购成功的redis表中
                $this->redis->lPush($redis_user_name,$uid."_".microtime().rand(10000,99999));
                $str .= $uid."抢购成功";
            }
        }
        //存日志信息与流程无关
        $file = fopen("/www/wwwlogs/redis_log", "a+");        //创建文件或打开文件
        fwrite($file, '抢购信息' . '----' . $str . '-------------------' . '时间:' . date('Y-m-d H:i:s', time()) . "\r\n");
         echo '完成';
    }
}

关注公众号技术谈论:靳某某的PHP爬坑之旅

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值