当前位置: 首页 > 后端技术 > PHP

基于redis的消息队列和key空间通知实现商品抢购和限时支付

时间:2023-03-30 05:22:37 PHP

基于Redis的消息队列实现固定库存商品的快速采购//需要在后台将商品总库存写入库存队列,提前写入$redis=newRedis();$redis->connect('127.0.0.1',6379);$redis->auth('alloc');$redis->select(1);//获取库存并写入队列$k=$redis->lPop('sale_count');echo$k;如果($k>1){如果($k-1==0){$redis->del('sale_count');}else{$redis->lPush('sale_count',$k-1);}echo'购买成功!';}else{echo'卖完了!';}基于以上基础,解决采购数量入库,超时未支付订单取消订单,恢复库存;$redis->connect('127.0.0.1',6379);$redis->auth('alloc');$redis->select(1);//$user_id=rand(1,10000);//随机模拟用户ID不重复$buy_num=rand(1,9);//随机模拟购买数量//获取库存减一写入队列$k=$redis->lPop('sale_count');if($k>1){if($k-$buy_num<=0){exit('库存不足');}else{$redis->rPush('get_good_list',$user_id);//会抓取序列插入到队列中,在守护进程1中处理$redis->setex($user_id,1800,$buy_num);//设置超时时间为30分钟$redis->rPush('sale_count',$k-$buy_num);}echo'购买成功!,请在五分钟内付款';}else{echo'售罄!';}connect('127.0.0.1',6379);$redis->auth('alloc');$redis->select(1);//while(1){$user_id=$redis->lPop('get_good_list');if($user_id){//获取购买数量$buy_num=$redis->get($user_id);//创建订单$order_no=createOder($user_id,$buy_num);//设置订单超时$redis->setex($order_no,300,1);//5分钟未付通知Daemon2.php}//>connect('127.0.0.1',6379);$redis->auth('alloc');$redis->select(1);//没有timeout$redis->setOption(\Redis::OPT_READ_TIMEOUT,-1);//创建事件监听,__keyevent@1__:过期,数字1代表数据库序列号$redis->psubscribe(array('__keyevent@1__:expired'),'keyCallback');//回调函数,这里写处理逻辑functionkeyCallback($redis,$pattern,$chan,$order_no){//获取订单信息获取购买数量$buy_num=getOderInfo($order_no);//关闭订单关闭订单();//添加股票$redis->rPush('sale_count',$redis->lPop('sale_count')+$buy_num);}