drools动态执行规则(使用swoole 定时器变更超时未支付订单状态的解决方案)
drools动态执行规则
使用swoole 定时器变更超时未支付订单状态的解决方案如果对几种方案没有很好的想法,可以先看一下延伸阅读里的其他方案,是一篇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 定时器变更超时未支付订单状态的解决方案,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对开心学习网网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
原文链接:https://segmentfault.com/a/1190000019851178
- php脚本控制方法(php swoole多进程/多线程用法示例基于php7nts版)
- thinkphp接口开发实例(ThinkPHP5.0框架结合Swoole开发实现WebSocket在线聊天案例详解)
- php的流程控制语句(PHP基于swoole多进程操作示例)
- curl怎么设置方法(关于Curl在Swoole协程中的解决方案详析)
- php 创建定时任务(PHP扩展Swoole实现实时异步任务队列示例)
- php的流程控制语句(php基于 swoole 实现的异步处理任务功能示例)
- drools动态执行规则(使用swoole 定时器变更超时未支付订单状态的解决方案)
- php单例模式教程学习(PHP下用Swoole实现Actor并发模型的方法)
- php系统化框架教程(PHP+swoole+linux实现系统监控和性能优化操作示例)
- linux虚拟主机怎么设置(linux系统虚拟主机开启支持Swoole Loader扩展的方法)
- phpredis怎么实现任务(PHP swoole和redis异步任务实现方法分析)
- drools机制(Swoole实现异步投递task任务案例详解)
- sw动态注解视图干嘛的(Swoole 5将移除自动添加Event::wait特性详解)
- 怎么才可以财富自由(如何让自己实现财富自由)
- 为什么越来越多年轻人回农村(为什么越来越多年轻人回农村生活)
- 怎么快速学好英语(怎么快速学好英语初中)
- 中国留学生都是富二代吗()
- 我们现在吃的苹果是哪里来的 原来现代苹果引入中国仅有一百多年(我们现在吃的苹果是哪里来的)
- 买绿宝不能只挑黄绿色 菜农教你3招挑,个个皮薄肉脆,香甜爆汁(买绿宝不能只挑黄绿色)
热门推荐
- css before和after(CSS中灵活使用:before和:after)
- MVC扩展HtmlHelper实现CheckBoxList
- python的三维画图(python处理DICOM并计算三维模型体积)
- 网页打开serviceunavailable(503 service unavailable错误解决方案讲解)
- css行高line-height的用法
- webpack打包分析(webpack代码分片的实现)
- asp.net网站如何优化
- ros必须在ubuntu安装吗(详解ubuntu20.04下CLion2020.1.3安装配置ROS过程说明)
- react自适应布局如何实现(React实现分页效果)
- dedecms默认模板目录(DEDECMS 5.7 将data目录迁移后,网站地图无法打开和更新的解决方法)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9