需求:windows环境中实现:订单在规定时间内未支付,则修改订单状态为作废。
思路:
1.在生成订单时,把订单号(order_id)、当前时间(时间戳)+设置的过期时间,这两个参数,存入到redis的有序集合里面。score 存时间戳,value 存订单号(order_id)
2.创建指令,定期执行,获取redis有序集合里面的内容,只获取一条。由于排序特性,始终获取到的是score最小的一条。
3.与当前时间作判断,小于当前时间,说明已过期了,修改数据库订单状态,并在reids中删除该条数据。
实现代码:
添加redis有序集合代码:
修改过期订单:
1.首先查看自定义指令的官方文档,并按照官方文档所说,实现看一下效果:https://www.kancloud.cn/manual/thinkphp6_0/1037651
2.用phpstorm 打开cmd,输入命令:php think make:command "app\api\command\Order",即在app\api下生成目录command和Order文件
或者在项目根目录,的路径上,直接输入cmd,都可以打开
3.配置指令,在Order文件中添加上自定义的操过期订单的代码
4.处理过期订单的方法:注意获取的范围(0~time()),获取0到当前时间的数据。
5.测试,生成个订单,然后执行指令。把过期时间设置为1分钟。然后再随便添加个数据,看能否被删除。
再次测试:
至此,需求就被实现了。
当然,后期数据量大了,总是处理不过来过期订单,那就建立多个指令,运行多个指令。获取把循环时间调小。但还是有需要优化的地方,比如,运行了50个指令,这个时候,就需要,用redis的锁以及数据库的锁来处理有序集合了,避免发生冲突。
参考资料:
https://www.kancloud.cn/manual/thinkphp6_0/1037651
https://www.runoob.com/redis/sorted-sets-zrangebyscore.html