如果你对几个方案没有很好的想法,可以先看看扩展阅读中的其他方案,这是laravel中国社区的一个讨论
借助redis的swoole定时器和zset,实现定期检查和逾期订单
源于一个需求:30分钟内未付款的订单被逾期处理成无效状态。
最传统和最简单的解决方案是:在服务器上运行一个预定的任务,查询数据表中的数据,查找未付订单,更新这些数据的状态,
这些数据在redis中也可以存在,一般的操作是这样的。在数据量小,服务器压力不大的情况下,这些方案不会突出优缺点,会用自己想要的那一个。
另一个方案:存储部分:借助redis的zset有序集,当生成订单时,zadd orders时间戳orderid将orderid保存到对应的
在订单集中,时间戳作为他的分数,存储部分是这样的,只是占用的内存很少。读取部分:swoole启动时,设置一个定时器,每分钟以设定的顺序读取设定时间前的数据。为了测试方便,个人设置为从第一分钟到第一个30分钟读取数据。获取数据后,根据业务逻辑对数据进行处理,然后zrem orders orderid命令从集合中移除相应的orderid。个人认为这个方案是一个既占用内存又有效率的方案。代码如下:
order.php
?PHP $ server=new swoole _ web socket _ server(' 0 . 0 . 0 . 0 ',9502);//在定时器中使用coroutine时,需要添加这个配置$ server-set([' enable _ coroutine '=true]);$server-on('workerStart ',函数($server,$ WorkerId){ $ Redis=new Swoole Coroutine Redis();$redis-connect('127.0.0.1 ',6379);//tick是连续触发的定时器swoole _ timer _ tick (10000,function()use($ redis){ $ upper limit time=strtime('-1分钟'));$lowerLimitTime=strtotime('-30分钟');回声'上限时间: '。$upperLimitTime。下限时间:’。$ lowerLimitTime$ result=$ redis-zrangebycore(' orders ',$lowerLimitTime,$ upper limittime);var _ dump($ result);//根据查询到的id进行业务处理,然后zrem orders删除处理成功的order id });});$server-on('message ',function(swoole _ web socket _ server $ server,$ request){ $ server-push($ request-FD,' hello ');});$ server-start();测试过程:PHP order.php打开swoole监控,然后启动一个新的终端,在redis的orders Collection中不断写入新的数据,效果如下图:
扩展阅读:
1.swole _ timer _ tick文档
2.2.laravel中国区相关文章
摘要
以上是边肖推出的利用swoole定时器改变逾期订单状态的解决方案。希望对大家有帮助。如果你有任何问题,请给我留言,边肖会及时回复你。非常感谢您对我们网站的支持!如果你觉得这篇文章对你有帮助,请转载,请注明出处,谢谢!