资讯专栏INFORMATION COLUMN

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

saucxs / 2669人阅读

摘要:基于的消息队列实现固定库存商品抢购商品总库存需要在后台写入到库存队里中提前写入获取库存并减一写入队列抢购成功售卖完毕基于上面的基础解决购买数量存储,超时不支付订单取消订单并恢复库存商品总库存需要在后台写入到库存队里中提前写入

基于Redis的消息队列实现固定库存商品抢购
//商品总库存需要在后台写入到库存队里中,提前写入
$redis = new Redis();
$redis->connect("127.0.0.1",6379);
$redis->auth("alloc");
$redis->select(1);
//获取库存并减一写入队列
$k = $redis->lPop("sale_count");
echo $k;
if($k>1){
    if($k-1 == 0){
        $redis->del("sale_count");
    }else{
        $redis->lPush("sale_count",$k-1);
    }
    echo "抢购成功!";
}else{
    echo "售卖完毕!";
}
基于上面的基础解决购买数量存储,超时不支付订单取消订单并恢复库存
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);
//不超时
$redis->setOption(Redis::OPT_READ_TIMEOUT, -1);
//创建事件监听,__keyevent@1__:expired,数字1代表数据库序号
$redis->psubscribe(array("__keyevent@1__:expired"), "keyCallback");
// 回调函数,这里写处理逻辑
function keyCallback($redis, $pattern, $chan, $order_no){
    //获取订单信息 获取购买数量
    $buy_num = getOderInfo($order_no);
    //关闭订单
    closeOrder();
    //加入库存
    $redis->rPush("sale_count",$redis->lPop("sale_count")+$buy_num);
}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/29690.html

相关文章

  • PHP面试题

    摘要:质量高在设计时,可重用现有的,在以前的项目的领域中已被测试过的类使系统满足业务需求并具有较高的质量。代码块捕获异常,并创建一个包含异常信息的对象。这样可以解决超卖的问题,但是会导致文件得开销很大。 6.你们公司是使用什么框架? 答:我们公司采用的是TP框架,运用的mysql+apache+php进行开发,因为TP框架是一个免费开源的,轻量级的php开发框架,而且是我们中国人自己开发的,...

    ls0609 评论0 收藏0
  • 「真®全栈之路」Web前端开发后端指南

    前言 在若干次前的一场面试,面试官看我做过python爬虫/后端 的工作,顺带问了我些后端相关的问题:你觉得什么是后端? 送命题。当时脑瓦特了,答曰:逻辑处理和数据增删改查。。。 showImg(https://user-gold-cdn.xitu.io/2019/4/24/16a4ed4fc8c18078); 当场被怼得体无完肤,羞愧难当。事后再反思这问题,结合资料总结了一下。发现自己学过的Re...

    chuyao 评论0 收藏0

发表评论

0条评论

saucxs

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<