资讯专栏INFORMATION COLUMN

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

tracy / 1678人阅读

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

基于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/36970.html

相关文章

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

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

    saucxs 评论0 收藏0
  • 重磅发布- Java商城秒杀系统设计与实战视频教程(SpringBoot版)

    摘要:技术列表缓存中间件服务协调调度中间件消息中间件综合性质的中间件分布式锁分布式唯一生成服务雪花算法邮件服务权限认证授权矿建的登录认证服务以及等等。 概要介绍:历经一个多月的时间,debug亲自录制的Java商城秒杀系统的设计与实战视频教程(SpringBoot版)终于完成了!在本课程中,debug真正的将之前所讲解的相关技术融入到了本课程中,即本课程所介绍的秒杀系统是一个真正意义上的项目...

    崔晓明 评论0 收藏0
  • 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
  • SegmentFault 技术周刊 Vol.37 - 分布式缓存利器:Redis

    摘要:持久化到中反向代理的负载均衡基于的集群搭建如何实现从中订阅消息转发到客户端的扩展是阻塞式,使用订阅发布模式时,会导致整个进程进入阻塞。缓存是用于解决高并发场景下系统的性能及稳定性问题的银弹。 showImg(https://segmentfault.com/img/bVYE6k?w=900&h=385); Redis 是由意大利程序员 Salvatore Sanfilippo(昵称:a...

    kuangcaibao 评论0 收藏0

发表评论

0条评论

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