使用swoole 定时器变更超时未支付订单状态的解决方案
swoole  /  管理员 发布于 5年前   473
如果对几种方案没有很好的想法,可以先看一下延伸阅读里的其他方案,是一篇laravel china社区的讨论 借助 swoole 定时器和 redis 的 zset 来实现的定时检查并过期未支付订单 起源于一个需求:将30分钟内未支付的订单过期处理成已失效状态。 最常规简单的解决方案:在服务器上,跑一个定时任务,去数据表中查询数据,查到未支付的订单,update 一下这些数据的状态, 这些数据也可以存在在 redis 中,大致操作都是这样的。数据量少,服务器没有很多压力的时候,这几种方案不会突出优劣,想用哪个用哪个。 另一种方案: 存储部分: 借助 redis 的 zset 有序集合,订单产生的时候, zadd orders timestamp orderid 将 orderid 保存到对应的 orders 集合中,以时间戳作为他的 score 分值,存储部分是这样的,简单 + 占用空间内存极小。 读取部分: 在 swoole 启动时,设置定时器,每分钟去 orders set 中读取设置的时间之前的数据,个人为了测试方便,设置的读取前一分钟到前三十分钟内的数据。获取到数据之后,根据业务逻辑处理数据,然后 order.php 测试过程: 延伸阅读: 1.swoole_timer_tick 文档 2.laravel china上的相关文章 总结 以上所述是小编给大家介绍的使用swoole 定时器变更超时未支付订单状态的解决方案,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对站的支持!zrem orders orderid
命令从集合中移除对应的 orderid。 个人以为这个方案是内存占用和效率兼具的一个方案。 代码如下: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 有序集合中不断写入新数据,效果如下图:
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!您可能感兴趣的文章:
122 在
学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号