这个功能在之前的项目中就用到过,其实这个功能在实际项目中能用到的场景还是比较多的,用到的频率也是比较高,
因为之前专注写业务代码,服务器搭建优化,调试,线上部署等这些操作很少有实际的经验,最近想着在自己的本地来玩玩这些东西
于是开干,自己本地电脑windows环境安装好laravel和redis
首先在自己本地的redis窗口调试看能不能收到对应的监听:
这里遇到一个坑,本地的redis配置自己没有看清楚
我一直在 redis.windows-service.conf里面配置 notify-keyspace-events "Ex" 调试了好多次监听窗口都没有任何反应
于是回头全部重新把文件结果看了一下原来还有一个 redis.windows.conf,然后在这里面配置好之后,再调试
成功了
image
调试的步骤如下:
开启两个窗口
A窗口输入监听命令:PSUBSCRIBE keyevent@0:expired
B窗口创建测试的数据并设置过期时间
image
最终laravel也调试成功了
image
具体详细的介绍一下laravel这边配置和代码
1.创建监听的脚本
命令:
php artisan make:command 文件名
如何会在laravel目录结构下创建一个文件
我本地的目录结构 app\Console\Commands\文件名.php
如何把脚本编写成这样 贴一下我的代码:
namespace App\Console\Commands;
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 = '监听创建的订单,在30分钟后如果没有付款取消订单';
/**
* 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){ // 订阅键过期事件
echo $channel.PHP_EOL;//订阅的频道
//echo $message.PHP_EOL;//过期的key
echo '---'.PHP_EOL;
});
}
}
2.在某个控制器丽创建redis数据测试即可 不贴代码 截图表示一下
image
3.最终的结果 redis窗口和laravel脚本窗口都同步监听到了过期的key, 成功拿到可以之后,你们就可以想怎么玩就怎么玩了
image
几个重点总结:
1.Redis 的 2.8.0 版本之后可用才可以使用这个功能
具体原理是 键空间消息(Redis Keyspace Notifications),配合 2.0.0 版本之后的 SUBSCRIBE 就能完成这个定时任务的操作了,定时的单位是秒。
2.这个功能我们可以封装起来,能使用到场景也是很多的,
3.在以后的实际业务场景中遇到相关发坑,我再记录分享,用一个功能,怎么用好关键是知道他的坑在哪里,避开坑,你就能随意摩擦了