Laravel8.5 未付款订单通过Redis键空间通知过期事件归还库存

本文介绍了在 Laravel 框架中如何利用 Redis 的键空间通知功能,监听订单过期事件,当用户下单后1小时未付款时自动取消订单。首先在.env文件中配置缓存为Redis,然后在控制器中添加缓存订单的方法,最后创建一个 artisan 命令 OrderExpireListen,通过 Redis 订阅过期事件来执行订单取消操作。
摘要由CSDN通过智能技术生成

在 PHP对Redis键空间通知过期事件的应用实例 一文中,已经介绍了PHP对Redis键空间通知功能的应用。本文主要介绍laravel中对Redis键空间通知过期事件的应用。

场景:用户下单后一个小时如果没付款就取消掉订单。

要实现这个,有了前文的基础,我们肯定不会只想到crontab定时去做,还会想到用Redis去实现。那么具体该怎么操作?请往下看:

1、先配置一下 .env 文件 ,缓存设置为Redis。

CACHE_DRIVER=redis

2、在控制器中新增订单的方法中加入缓存。

Cache::store('redis')->put('ORDER_CONFIRM:'.$order->id,$order->id,1); // 1分钟后过期。这里为了测试方便,暂设置为1分钟。

3、自定义artisan命令。

php artisan make:command OrderExpireListen

app\Console\Commands\OrderExpireListen.php文件

<?php
 
namespace App\Console\Commands;
 
use App\Model\Order;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Redis;
 
class OrderExpireListen extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'order:expire';
 
    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = '监听订单创建,在1分钟后如果没付款取消订单。';
 
    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }
 
    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        $cachedb = config('database.redis.cache.database', 0);
        $pattern = '__keyevent@' . $cachedb . '__:expired';
        Redis::subscribe($pattern, function ($channel) {     // 订阅键过期事件
            // laravel_cache:ORDER_CONFIRM:7 这样的格式
            $channel = trim(strstr($channel, ':'), ':');
            $key_type = str_before($channel, ':');
            switch ($key_type) {
                case 'ORDER_CONFIRM':
                    $order_id = str_after($channel, ':');    // 取出订单 ID
                    $order = Order::query()->find($order_id);
                    if ($order) {
                        // 执行取消操作
                        $order->status = 2;
                        $order->save();
                    }
                    break;
                case 'ORDER_OTHEREVENT':
                    break;
                default:
                    break;
            }
        });
    }
}

laravel_cache:ORDER_CONFIRM:7 这个可以通过下面方法查询: 

127.0.0.1:6379> keys *
1) "laravel_cache:ORDER_CONFIRM:7"

过期后,我们在Redis客户端可以看到如下内容: 

127.0.0.1:6379> psubscribe __keyevent@0__:expired
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "__keyevent@0__:expired"
3) (integer) 1
1) "pmessage"
2) "__keyevent@0__:expired"
3) "__keyevent@0__:expired"
4) "laravel_cache:5c785c036466adea360111aa28563bfd556b5fba"
1) "pmessage"
2) "__keyevent@0__:expired"
3) "__keyevent@0__:expired"
4) "laravel_cache:5c785c036466adea360111aa28563bfd556b5fba:timer"
1) "pmessage"
2) "__keyevent@0__:expired"
3) "__keyevent@0__:expired"
4) "laravel_cache:ORDER_CONFIRM:7"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值