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+linux实现系统监控和性能优化操作示例)
- phpredis怎么实现任务(PHP swoole和redis异步任务实现方法分析)
- php 创建定时任务(PHP扩展Swoole实现实时异步任务队列示例)
- thinkphp接口开发实例(ThinkPHP5.0框架结合Swoole开发实现WebSocket在线聊天案例详解)
- linux虚拟主机怎么设置(linux系统虚拟主机开启支持Swoole Loader扩展的方法)
- drools机制(Swoole实现异步投递task任务案例详解)
- php脚本控制方法(php swoole多进程/多线程用法示例基于php7nts版)
- curl怎么设置方法(关于Curl在Swoole协程中的解决方案详析)
- php的流程控制语句(PHP基于swoole多进程操作示例)
- drools动态执行规则(使用swoole 定时器变更超时未支付订单状态的解决方案)
- sw动态注解视图干嘛的(Swoole 5将移除自动添加Event::wait特性详解)
- php单例模式教程学习(PHP下用Swoole实现Actor并发模型的方法)
- php的流程控制语句(php基于 swoole 实现的异步处理任务功能示例)
- 弄清楚了销 售 买 卖这四个字,母婴生意做起来就没那么难了(弄清楚了销售买)
- 数读 买首饰金是 投资黄金 吗 买金容易卖金难(数读买首饰金是)
- 销 售 买 卖 你真的了解这四个字了吗(销售买)
- 谢娜是得罪快乐大本营造型师了吗 全场被黑化(谢娜是得罪快乐大本营造型师了吗)
- 前《iLOOK》时装总监 《快乐大本营》御用造型师上线(快乐大本营御用造型师上线)
- 释小龙晒杀青照片 多重身份惹观众期待(释小龙晒杀青照片)
热门推荐
- python中赋值语句规则(Python动态赋值的陷阱知识点总结)
- sql server 2014配置文件路径(SQL Server 2012 FileTable 新特性详解)
- dede网站怎么修改数据结构表(Dede中通过SQL调用简略标题shorttitle和链接地址的方法)
- laravel时间日期字段比较(Laravel find in set排序实例)
- dedecms能自定义么(dedecms5.7联动类型无法显示的解决方法)
- treeview怎么加载节点(AmazeUi Tree树形结构 应用小结)
- mysql视图管理方法(MySQL 视图View原理解析)
- laravel5开发规范(laravel5.1框架基础之路由详解)
- 阿里云子账户密码重置(阿里云账号密码忘记了怎么办?阿里云账号密码找回方法)
- css 最高层级(浅谈CSS 权值 层叠 重要性!important)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9