Thinkphp商城订单过期处理:
在完成订单入库后,利用redis 有序列表将,订单号丶过期时间插入列表,然后利用清理脚本对订单清理,如果发现订单到期还没有支付就将订单取消将sku库存还原。
无标题-2022-11-15-0118.png
订单插入:
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')
最后修改:2022 年 12 月 27 日
如果觉得我的文章对你有用,请随意赞赏