测试环境:windows 10 + phpStudy

配置redis配置文件 redis.windows.conf

notify-keyspace-events "Ex"

重启redis服务

重新打开一个控制台窗口,执行命令

psubscribe __keyevent@0__:expired

打开新窗口执行了阻塞订阅操作后的终端,等会会有信息输出:

C:\Users\admin>redis-cli
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

再开启一个终端,redis-cli 进入 redis,新增一个 6秒过期的键 username:

命令行完成了

二、借助TP5.1 的命令行工具

命令行工具的使用:https://www.kancloud.cn/manual/thinkphp5_1/354146

1、新建命令行pay

<?php
/**.-------------------------------------------------------------------------------------------------------------------
* | Github: https://github.com/Tinywan
* '------------------------------------------------------------------------------------------------------------------*/ namespace app\common\command; use app\pay\service\RedisSubscribe;
use think\console\Command;
use think\console\Input;
use think\console\input\Argument;
use think\console\Output; class Pay extends Command
{
// 配置指令
public function configure()
{
$this->setName('pay')
->addArgument('type', Argument::REQUIRED, "the type of the task that pay needs to run")
->setDescription('this is payment system command line tools');
} // 执行指令
public function execute(Input $input, Output $output)
{
$type = $input->getArgument('type');
if ($type == 'psubscribe') {
// 发布订阅任务
$this->psubscribe();
}
} /**
* Redis 发布订阅模式
*/
private function psubscribe()
{
$service = new RedisSubscribe();
$service->sub();
}
}

2、编写脚本 RedisSubscribe.php

<?php
/**.-------------------------------------------------------------------------------------------------------------------
* | Github: https://github.com/Tinywan
* '------------------------------------------------------------------------------------------------------------------*/ namespace app\pay\service; use redis\BaseRedis;
use think\facade\Log; class RedisSubscribe
{
public function sub()
{
Log::error(get_current_date().'--过期事件的订阅-- ');
$redis = BaseRedis::location(); //这里是直接连接本地redis
$redis->setOption(\Redis::OPT_READ_TIMEOUT, -1);
$redis->psubscribe(array('__keyevent@0__:expired'), function ($redis, $pattern, $chan, $msg) {
Log::error('[1]--过期事件的订阅 ' . $msg);
});
}
}

说明:psubscribe( $patterns, $callback ) 方法的第二个参数为一个回调函数,这里我使用闭包作为一个回调。

官方解释:匿名函数(Anonymous functions),也叫闭包函数(closures),允许 临时创建一个没有指定名称的函数。最经常用作回调函数(callback)参数的值。当然,也有其它应用的情况。

3、在TP5 项目根目录执行pay 命令工具

php think pay psubscribe

4、新打开console 窗口终端

C:\Users\admin>redis-cli
127.0.0.1:6379> setex UserName 10 Tinywan
OK
127.0.0.1:6379> get UserName
"Tinywan"
127.0.0.1:6379> get UserName
(nil)
127.0.0.1:6379>

5、查看打日志文件,看有没有接收到过期的key

6、最终的结果如下所示

更高级的慢慢扩展

1、自动取消订单

2、订单完成后发送短信

3、延迟任务等等

  

  

  

  

最新文章

  1. java中文乱码解决之道(七)-----JSP页面编码过程
  2. MySQL常用技巧
  3. jquery 下了框
  4. #pragma once
  5. Windows下Android Studio长时间停留在Building &quot;Project Name&quot; Gradle project info画面的解决方法
  6. C++安装JSONCPP
  7. LightOJ1370 Bi-shoe and Phi-shoe
  8. 记录一个古老的Sql分页过程
  9. js常用API方法
  10. python爬虫之redis环境简单部署
  11. qml: 组件复用
  12. 专题 查找与排序的Java代码实现(一)
  13. Go语言规格说明书 之 类型声明(Type declarations)
  14. 微软官方的.net开发人员代码示例
  15. selenium玩转svg操作
  16. [TJOI2015]概率论[卡特兰数]
  17. MySQL5.7(二)数据库的基本操作
  18. jquery选择器 直观实验
  19. (八)netty的SSL renegotiation攻击漏洞
  20. 【WXS全局对象】Date

热门文章

  1. 【XSY1544】fixed 数学 强连通图计数
  2. 将xml文件由格式化变为压缩字符串
  3. windows 基础命令小集
  4. mysql 0x80004005 unable to connect to any of the specified mysql hosts
  5. 【Loj116】有源汇有上下界最大流(网络流)
  6. centos7安装Jenkins更改默认端口并配置Ldap服务器进行用户认证
  7. iptables防火墙详解(二)
  8. request.getRequestDispatcher 页面跳转,样式丢失。
  9. Manjaro下带供电的USB Hub提示error -71
  10. 洛谷P3354 河流