php加redis队列处理订单,简单一个处理订单的Redis消息队列

思路:   订单量大的话可以用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 结构类型更好!!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值