Thinkphp商城订单过期处理:
在完成订单入库后,利用redis 有序列表将,订单号丶过期时间插入列表,然后利用清理脚本对订单清理,如果发现订单到期还没有支付就将订单取消将sku库存还原。
订单插入:
1.使用Zadd 方法将订单插入redis有序列表
/*Cache::Zadd('订单序列名字',过期时间,订单号)*/
Cache::Zadd('order_data_wait_oay_list', 1668483567, 'SG1234567');
待支付订单清理:
1.使用自定义指令集,在功能模块下新建commad文件夹,创建订单消费指令方法
<?php
namespace app\command;
use app\common\business\api\OrderBusiness;
use think\console\Command;
use think\console\Input;
use think\console\Output;
class OrderNotPaid extends Command
{
protected function configure()
{
$this->setName('orderNotPaid');
}
/**
* 订单消费
* @param Input $input
* @param Output $output
* @return int|null
*/
protected function execute(Input $input, Output $output)
{
$OrderBusiness = new OrderBusiness();
//利用while使其一直执行
while (true) {
//订单待支付处理方法
$result = $OrderBusiness->checkoutOrderSnRedis();
//打印订单处理结果
echo $result;
//设置执行间隔时间
sleep(1);
}
}
}
自定义指令集需要在conslole
2.从redis有序列表中拿出一条过期数据,取当前时间以内的一条数据。
/**
*Cache::Store('redis') 指定缓存
*Zrangebyscore('订单序列名字', 时间范围min(设置0 *表示0到最大), time()(设置当前时间), ['limit' => ['0', '1']](设置取出数量页数等));
*$redisList 返回为数组,数据内容为订单号。因为取出一条数据所以订单号为$redisList[0]
*/
$redisList = Cache::Store('redis')->Zrangebyscore('order_data_wait_oay_list', 0, time(), ['limit' => ['0', '1']]);
3.对已过期取出的订单在redis中删除
/*Cache::Store('redis')->Zrem('订单序列名字', '订单号');*/
$redisListDel = Cache::Store('redis')->Zrem('order_data_wait_oay_list', $redisList[0]);
4.根据返回的订单号 查询相对应的订单数据,对Sku库存进行还原。
Thinkphp在使用redis有序列表中遇到的问题:
1.多应用下自定义指令集如果用命令快速创建可能会出错,建议手动在应用下创建command文件然后创建指令文件。
2.使用自定义指令集,多应用下无法识别多应用下config()参数,必须将该参数写入app/config 下才能识别。
3.使用自定义指令集,多应用下无法使用多应用下配置的缓存方案,需要在app\cache.php 中设置缓存方案,并且写对数据读取删除时指定 redis
cache.php
<?php
// +----------------------------------------------------------------------
// | 缓存设置
// +----------------------------------------------------------------------
return [
// 默认缓存驱动
'default' => env('cache.driver', 'file'),
// 缓存连接方式配置
'stores' => [
'file' => [
// 驱动方式
'type' => 'File',
// 缓存保存目录
'path' => '',
// 缓存前缀
'prefix' => '',
// 缓存有效期 0表示永久缓存
'expire' => 0,
// 缓存标签前缀
'tag_prefix' => 'tag:',
// 序列化机制 例如 ['serialize', 'unserialize']
'serialize' => [],
],
// 更多的缓存连接
'redis' => [
'type' => 'redis',
'host' => env('REDIS.HOST', '127.0.0.1'),
'port' => env('REDIS.PORT', '6379'),
],
],
];
//指定redis 缓存
Cache::Store('redis')