使用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 相关文章推荐
用PHP和ACCESS写聊天室(九)
Oct 09 PHP
php for 循环语句使用方法详细说明
May 09 PHP
PHP学习笔记之三 数据库基本操作
Jan 17 PHP
php设计模式 Decorator(装饰模式)
Jun 26 PHP
mantis安装、配置和使用中的问题小结
Jul 14 PHP
THINKPHP支持YAML配置文件的设置方法
Mar 17 PHP
PHP中把有符号整型转换为无符号整型方法
May 27 PHP
PHP中ajax无刷新上传图片与图片下载功能
Feb 21 PHP
PHP redis实现超迷你全文检索
Mar 04 PHP
PHP实现基于面向对象的mysqli扩展库增删改查操作工具类
Jul 18 PHP
PHP实现动态添加XML中数据的方法
Mar 30 PHP
thinkPHP3.2.3实现阿里大于短信验证的方法
Jun 06 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
PHP strtotime函数详解
2009/12/18 PHP
php通过array_shift()函数移除数组第一个元素的方法
2015/03/18 PHP
CI框架扩展系统核心类的方法分析
2016/05/23 PHP
对YUI扩展的Gird组件 Part-1
2007/03/10 Javascript
js弹出的对话窗口永远保持居中显示
2012/12/15 Javascript
Ajax异步提交表单数据的说明及方法实例
2013/06/22 Javascript
JS验证身份证有效性示例
2013/10/11 Javascript
5秒后跳转到另一个页面的js代码
2013/10/12 Javascript
Html5的placeholder属性(IE兼容)实现代码
2014/08/30 Javascript
理解javascript封装
2016/02/23 Javascript
Javascript日期格式化format函数的使用方法
2016/08/30 Javascript
Vue.js路由vue-router使用方法详解
2017/03/20 Javascript
Windows下支持自动更新的Electron应用脚手架的方法
2018/12/24 Javascript
js动态获取时间的方法分析
2019/08/02 Javascript
[09:40]DAC2018 4.5 SOLO赛 MidOne vs Miracle
2018/04/06 DOTA
python开发的小球完全弹性碰撞游戏代码
2013/10/15 Python
python之PyMongo使用总结
2017/05/26 Python
Python语言描述最大连续子序列和
2017/12/05 Python
在VS Code上搭建Python开发环境的方法
2018/04/06 Python
django将图片上传数据库后在前端显式的方法
2018/05/25 Python
简述 Python 的类和对象
2020/08/21 Python
解决Python3.8运行tornado项目报NotImplementedError错误
2020/09/02 Python
DHC中国官方购物网站:日本通信销售No.1化妆品
2016/08/20 全球购物
爱他美官方海外旗舰店:Aptamil奶粉
2017/12/22 全球购物
Agoda台湾官网:国内外订房2折起
2018/03/20 全球购物
波兰化妆品和护肤品购物网站:eKobieca
2019/08/30 全球购物
护理个人求职信范文
2014/01/08 职场文书
商学院大学生求职的自我评价
2014/03/12 职场文书
珍爱生命演讲稿
2014/05/10 职场文书
另类冲刺标语
2014/06/24 职场文书
西柏坡导游词
2015/02/05 职场文书
2015年体育部工作总结
2015/04/02 职场文书
通讯稿范文
2015/07/22 职场文书
Python中使用Lambda函数的5种用法
2021/04/01 Python
idea 在springboot中使用lombok插件的方法
2021/08/02 Java/Android
MySQL数据库⾼可⽤HA实现小结
2022/01/22 MySQL