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


Posted in PHP onJuly 24, 2019

如果对几种方案没有很好的想法,可以先看一下延伸阅读里的其他方案,是一篇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 有序集合中不断写入新数据,效果如下图:

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

延伸阅读:

1.swoole_timer_tick 文档

2.laravel china上的相关文章

总结

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

PHP 相关文章推荐
打造计数器DIY三步曲(上)
Oct 09 PHP
php str_pad() 将字符串填充成指定长度的字符串
Feb 23 PHP
phpmyadmin 常用选项设置详解版
Mar 07 PHP
编写Smarty插件在模板中直接加载数据的详细介绍
Jun 26 PHP
thinkphp验证码显示不出来的解决方法
Mar 29 PHP
让CodeIgniter数据库缓存自动过期的处理的方法
Jun 12 PHP
PHP中preg_match正则匹配中的/u、/i、/s含义
Apr 17 PHP
php is_executable判断给定文件名是否可执行实例
Sep 26 PHP
微信公众平台开发(五) 天气预报功能开发
Dec 03 PHP
php分页查询的简单实现代码
Mar 14 PHP
php+ajax实现仿百度查询下拉内容功能示例
Oct 20 PHP
php 中htmlentities导致中文无法查询问题
Sep 10 PHP
thinkphp5.1框架容器与依赖注入实例分析
Jul 23 #PHP
Thinkphp5 自定义上传文件名的实现方法
Jul 23 #PHP
PHP中__set()实例用法和基础讲解
Jul 23 #PHP
PHP大文件分块上传功能实例详解
Jul 22 #PHP
PHP商品秒杀问题解决方案实例详解【mysql与redis】
Jul 22 #PHP
php多进程应用场景实例详解
Jul 22 #PHP
PHP实现的多进程控制demo示例
Jul 22 #PHP
You might like
ThinkPHP CURD方法之limit方法详解
2014/06/18 PHP
php socket实现的聊天室代码分享
2014/08/16 PHP
php实现数组中索引关联数据转换成json对象的方法
2015/07/08 PHP
php中的buffer缓冲区用法分析
2019/05/31 PHP
Prototype使用指南之form.js
2007/01/10 Javascript
jquery 获取json数据实现代码
2009/04/27 Javascript
js onkeypress与onkeydown 事件区别详细说明
2012/12/13 Javascript
javascript移出节点removeChild()使用介绍
2014/04/03 Javascript
jquery简单的弹出层浮动层代码
2015/04/27 Javascript
JavaScript取得WEB安全颜色列表的方法
2015/07/14 Javascript
不得不分享的JavaScript常用方法函数集(下)
2015/12/25 Javascript
js获取页面及个元素高度、宽度的代码
2016/04/26 Javascript
详解js数组的完全随机排列算法
2016/12/16 Javascript
关于Vue背景图打包之后访问路径错误问题的解决
2017/11/03 Javascript
vue.js 双层嵌套for遍历的方法详解, 类似php foreach()
2018/09/07 Javascript
Postman的下载及安装教程详解
2018/10/16 Javascript
nodejs基础之常用工具模块util用法分析
2018/12/26 NodeJs
vue 项目 iOS WKWebView 加载
2019/04/17 Javascript
JavaScript中AOP的实现与应用
2019/05/06 Javascript
[01:47]2018年度DOTA2最佳教练-完美盛典
2018/12/16 DOTA
python监控网卡流量并使用graphite绘图的示例
2014/04/27 Python
python计算auc指标实例
2017/07/13 Python
利用python实现对web服务器的目录探测的方法
2019/02/26 Python
利用python numpy+matplotlib绘制股票k线图的方法
2019/06/26 Python
css3实现多个元素依次显示效果
2017/12/12 HTML / CSS
法国娇韵诗官方旗舰店:Clarins是来自法国的天然护肤品牌
2018/06/30 全球购物
Ancheer官方户外和运动商店:销售电动自行车
2019/08/07 全球购物
美国在线面料商店:Fashion Fabrics Club
2020/01/31 全球购物
总经理岗位职责说明书
2014/07/30 职场文书
预备党员期盼十八届四中全会召开思想汇报
2014/10/17 职场文书
小学语文复习计划
2015/01/19 职场文书
毕业晚宴祝酒词
2015/08/11 职场文书
员工给公司的建议书
2019/06/24 职场文书
Python数据清洗工具之Numpy的基本操作
2021/04/22 Python
排查MySQL生产环境索引没有效果
2022/04/11 MySQL
安装Ruby和 Rails的详细步骤
2022/04/19 Ruby