使用swoole 定时器变更超时未支付订单状态的解决方案

 更新时间:2019年07月24日 10:01:59   作者:he_xd  
本文主要是借助 swoole 定时器和 redis 的 zset 来实现的定时检查并过期未支付订单,感兴趣的朋友跟随小编一起看看吧

如果对几种方案没有很好的想法,可以先看一下延伸阅读里的其他方案,是一篇laravel china社区的讨论

借助 swoole 定时器和 redis 的 zset 来实现的定时检查并过期未支付订单

起源于一个需求:将30分钟内未支付的订单过期处理成已失效状态。

最常规简单的解决方案:在服务器上,跑一个定时任务,去数据表中查询数据,查到未支付的订单,update 一下这些数据的状态,

这些数据也可以存在在 redis 中,大致操作都是这样的。数据量少,服务器没有很多压力的时候,这几种方案不会突出优劣,想用哪个用哪个。

另一种方案: 存储部分: 借助 redis 的 zset 有序集合,订单产生的时候, zadd orders timestamp orderid 将 orderid 保存到对应的

orders 集合中,以时间戳作为他的 score 分值,存储部分是这样的,简单 + 占用空间内存极小。 读取部分: 在 swoole 启动时,设置定时器,每分钟去 orders set 中读取设置的时间之前的数据,个人为了测试方便,设置的读取前一分钟到前三十分钟内的数据。获取到数据之后,根据业务逻辑处理数据,然后 zrem orders orderid 命令从集合中移除对应的 orderid。 个人以为这个方案是内存占用和效率兼具的一个方案。 代码如下:

order.php

<?php$server = new swoole_websocket_server("0.0.0.0", 9502);
// 在定时器中使用协程需要增加此项配置
$server->set(
  [
    'enable_coroutine' => true
  ]
);
$server->on('workerStart', function ($server, $workerId) {
  $redis = new Swoole\Coroutine\Redis();
  $redis->connect('127.0.0.1', 6379);
  // tick 为持续触发的定时器
  swoole_timer_tick(10000, function() use ($redis) {
    $upperLimitTime = strtotime('-1 minute');
    $lowerLimitTime = strtotime('-30 minute');
    echo '上限时间:' . $upperLimitTime . '下限时间:' . $lowerLimitTime;
    $result = $redis->zrangebyscore('orders', $lowerLimitTime, $upperLimitTime);
    var_dump($result);
    // 根据查询到的 id 进行业务处理,然后 zrem orders orderid 移除处理成功的 orderid 
  });
});
$server->on('message', function (swoole_websocket_server $server, $request) {
  $server->push($request->fd, "hello");
});
$server->start();

测试过程: php order.php 开启 swoole 监听,然后新起终端,在 redis 的 orders 有序集合中不断写入新数据,效果如下图:

延伸阅读:

1.swoole_timer_tick 文档

2.laravel china上的相关文章

总结

以上所述是小编给大家介绍的使用swoole 定时器变更超时未支付订单状态的解决方案,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

相关文章

  • 使用PHP免费发送定时短信的实例

    使用PHP免费发送定时短信的实例

    本篇文章介绍了使用PHP免费发送定时短信的实例,可以定时的发送短信到手机上,有需要的朋友可以了解一下。
    2016-10-10
  • 使用php验证复选框有效性的示例

    使用php验证复选框有效性的示例

    本文介绍一个简单的php通过代码验证复选框值的有效性,有需要的可以参考一下
    2013-11-11
  • 实例讲解PHP表单验证功能

    实例讲解PHP表单验证功能

    在本文中我们给大家分享了关于PHP表单验证功能以及相关的实例代码内容,有需要的朋友们学习下。
    2019-02-02
  • 多个PHP中文字符串截取函数

    多个PHP中文字符串截取函数

    字符串截取是一个非常常见的编程任务,而往往带中文的字符串截取会经常用到。虽然不难,但是自己写函数实现又耗费时间,这里介绍一个比较好用的字符串截取函数,能够胜任基本的需求了
    2013-11-11
  • 解决laravel5中auth用户登录其他页面获取不到登录信息的问题

    解决laravel5中auth用户登录其他页面获取不到登录信息的问题

    今天小编就为大家分享一篇解决laravel5中auth用户登录其他页面获取不到登录信息的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-10-10
  • PHP生成唯一ID之SnowFlake算法

    PHP生成唯一ID之SnowFlake算法

    snowflake算法是个啥?首先我来提出个问题,怎么在分布式系统中生成唯一性id并保持该id大致自增?在twitter中这是最重要的业务场景,于是twitter推出了一种snowflake算法。
    2016-12-12
  • thinkphp5框架路由原理与用法详解

    thinkphp5框架路由原理与用法详解

    这篇文章主要介绍了thinkphp5框架路由原理与用法,结合图文与实例形式详细分析了thinkPHP5框架路由的相关原理、使用方法及操作注意事项,需要的朋友可以参考下
    2020-02-02
  • thinkphp5使用无限极分类

    thinkphp5使用无限极分类

    这篇文章主要为大家详细介绍了thinkphp5使用无限极分类,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-02-02
  • PHP编写daemon process详解及实例代码

    PHP编写daemon process详解及实例代码

    这篇文章主要介绍了PHP编写daemon process详解的相关资料,并附实例代码,有需要的小伙伴可以参考下
    2016-09-09
  • yii实现图片上传及缩略图生成的方法

    yii实现图片上传及缩略图生成的方法

    这篇文章主要介绍了yii实现图片上传及缩略图生成的方法,详细分析了图片的上传及缩略图的生成原理与实现方法,是非常实用的技巧,需要的朋友可以参考下
    2014-12-12

最新评论