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

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 在 PHP对Redis键空间通知过期事件的应用实例 一文中,已经介绍了PHP对Redis键空间通知功能的应用。本文主要介绍laravel中对Redis键空间通知过期事件的应用。场景:用户下单后一个小时如果没付款就取消掉订单。要实现这个,有了前文的基础,我们肯定不会只想到crontab定时去做,还会想到用Redis去实现。那么具体该怎么操作?请往下看:

在 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"


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
19天前
|
设计模式 NoSQL 网络协议
大数据-48 Redis 通信协议原理RESP 事件处理机制原理 文件事件 时间事件 Reactor多路复用
大数据-48 Redis 通信协议原理RESP 事件处理机制原理 文件事件 时间事件 Reactor多路复用
33 2
|
2月前
|
缓存 NoSQL PHP
使用PHP-redis实现键空间通知监听key失效事件的技术与代码示例
通过上述方法,你可以有效地在PHP中使用Redis来监听键空间通知,特别是针对键失效事件。这可以帮助你更好地管理缓存策略,及时响应键的变化。
83 3
|
4月前
|
canal 缓存 NoSQL
Redis常见面试题(一):Redis使用场景,缓存、分布式锁;缓存穿透、缓存击穿、缓存雪崩;双写一致,Canal,Redis持久化,数据过期策略,数据淘汰策略
Redis使用场景,缓存、分布式锁;缓存穿透、缓存击穿、缓存雪崩;先删除缓存还是先修改数据库,双写一致,Canal,Redis持久化,数据过期策略,数据淘汰策略
Redis常见面试题(一):Redis使用场景,缓存、分布式锁;缓存穿透、缓存击穿、缓存雪崩;双写一致,Canal,Redis持久化,数据过期策略,数据淘汰策略
|
5月前
|
存储 NoSQL Java
大事件后端项目34_登录优化----redis_SpringBoot集成redis
大事件后端项目34_登录优化----redis_SpringBoot集成redis
大事件后端项目34_登录优化----redis_SpringBoot集成redis
|
4月前
|
监控 NoSQL Redis
Redis性能优化问题之配置 Redis 的自动碎片整理功能,如何解决
Redis性能优化问题之配置 Redis 的自动碎片整理功能,如何解决
|
5月前
|
NoSQL 关系型数据库 MySQL
实时计算 Flink版产品使用问题之如何确保多并发sink同时更新Redis值时,数据能按事件时间有序地更新并且保持一致性
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
4月前
|
存储 NoSQL Redis
Redis07命令-String类型字符串,不管是哪种格式,底层都是字节数组形式存储的,最大空间不超过512m,SET添加,MSET批量添加,INCRBY age 2可以,MSET,INCRSETEX
Redis07命令-String类型字符串,不管是哪种格式,底层都是字节数组形式存储的,最大空间不超过512m,SET添加,MSET批量添加,INCRBY age 2可以,MSET,INCRSETEX
|
5月前
|
NoSQL Redis 数据安全/隐私保护
大事件后端项目35——登录优化_redis_主动失效机制实现
大事件后端项目35——登录优化_redis_主动失效机制实现
|
5月前
|
存储 NoSQL Redis
大事件后端项目33_登录优化-redis_思路分析
大事件后端项目33_登录优化-redis_思路分析
|
5月前
|
NoSQL Redis
Redis系列学习文章分享---第五篇(Redis实战篇--优惠券秒杀,全局唯一id 添加优惠券 实现秒杀下单 库存超卖问题分析 乐观锁解决超卖 实现一人一单功能 集群下的线程并发安全问题)
Redis系列学习文章分享---第五篇(Redis实战篇--优惠券秒杀,全局唯一id 添加优惠券 实现秒杀下单 库存超卖问题分析 乐观锁解决超卖 实现一人一单功能 集群下的线程并发安全问题)
116 0