PHP Redis Workerman 实现超时取消订单功能

PHP Redis Workerman 实现超时取消订单功能
秒杀业务逻辑,多个用户同时抢单,当用户没有支付订单超时时则取消该订单并归还库存

thinkphp redis workerman
1、用户创建订单向redis插入一条订单数据
$redis = new \Redis();
$redis->connect('127.0.0.1',6379);
/**
 *列队名称:seckillTime
 *到期时间戳:time()+$seckill['payTime']
 *订单id:$order->id //可以json字符串存储
*/
$redis->zAdd('seckillTime', time() + $seckill['payTime'], $order->id);

2、workerman 查询这个列队是否有消息,如果有就消费掉
 /**
  * 启动每个进程
  * @param $worker
 */
 public function onWorkerStart($worker)
 {
    date_default_timezone_set('PRC');
    $redis = new Redis();
    $redis->connect('127.0.0.1', 6379);
    if($worker->id === 0){
	    //
    }
    //秒杀进程
    if($worker->id === 1){
      echo "启动秒杀任务!\n";
      //workerman定时器,每秒执行一次。
      Timer::add(1, function() use($redis) {
          //通过zRangeByScore查询seckillTime列队中0到当前时间戳的数据。
          $res = $redis->zRangeByScore('seckillTime', 0, time());
          //存在数据
          if (count($res) > 0) {
              foreach ($res as $k=>$v){
                //处理订单,$res[$k]为生产者存的订单id或数据。
                //消费掉列队中的行数据
                $redis->zRem('seckill_time', $res[$k]);
              }
              unset($res);
          }
      });
  }
  redis延迟消息列队,将数据存入redis中,workerman出问题掉了,重新启动workerman也可以将没消费的数据消费掉
  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值