思路: 订单量大的话可以用PHP写个脚本用pnctl多开几个进程去处理消息队列 用户抢购订单时先生成订单 减库存及其他xxxx事情 让消息队列去做 用户之间跳到订单确认页
既可以提升用户下单速度又能保障库存的一致性
/**
* Created by PhpStorm.
* User: yann
* Date: 2017/8/3
* Time: 上午10:49
*/
$redis_ip = '127.0.0.1';
$logs_path = '/data/php/logs/';
$log_name = 'laravel-'.date('Y-m-d').'.log';
$mysql_ip = '127.0.0.1';
for($i=0;$i<=5;$i++) //开进程
{
$ret=pcntl_fork(); //生成进程
if($ret==0)
{
while(true) //做一个循环,让进程反复运行
{
$redis=new Redis();//连接redis
$redis->connect($redis_ip,6379);
if(count($redis->keys('panicbuying'))==0) //判断队列中是否有序列,如果没有则继续 “死”循环
{
sleep(1);
continue;
}
$getjob=$redis->zrange('panicbuying',0,0); //从队列中取出一个
$color_id = json_decode($getjob[0],1)['stock_id'];
if($redis->setnx("buy_lock_".$color_id,1)==1) //加锁 后期需要优化防止出错卡死 设置超时时间
{
$num = json_decode($getjob[0],1)['num'];
$pro_stock = $redis->hget('products_stock',$color_id);
$surplus_stock = $pro_stock-$num;
$redis->multi(); // redis事务开始
if($surplus_stock>=0)
{
$redis->hset('products_stock',$color_id,$surplus_stock);
}
$redis->zrem('panicbuying',$getjob[0]); //删除当前队列
$redis->del("buy_lock_".$color_id); //解锁
$redis->exec(); //结束事务
// 这里写你自己需要的一些处理 比如 写一些log啊 库存和数据库里的同步......
}
}
}
}
大并发存在性能问题 这边使用 list 结构类型更好!!!