redis 能不能监听特定的key失效_php监听redis key失效触发回调事件

订单超时、活动过期解决方案:php监听redis key失效触发回调事件

Redis 的 2.8.0 版本之后可用,键空间消息(Redis Keyspace Notifications),配合 2.0.0 版本之后的 SUBSCRIBE就能完成这个定时任务的操作了,定时的单位是秒。

1.我们先订阅频道名为 redisChat

2.现在,我们重新开启个 redis 客户端,然后在同一个频道 redisChat 发布消息,订阅者就能接收到消息。

接收到的消息如下:

3.Key过期事件的Redis配置

这里需要配置 notify-keyspace-events 的参数为 “Ex”。x 代表了过期事件。notify-keyspace-events “Ex” 保存配置后,重启Redis服务,使配置生效。

PHP redis实现订阅键空间通知

redis实例化类:

redis.class.php//遇到类别重复的报错,所有叫Redis2

class Redis2

{

private $redis;

public function __construct($host = '127.0.0.1', $port = 6379)

{

$this->redis = new Redis();

$this->redis->connect($host, $port);

}

public function setex($key, $time, $val)

{

return $this->redis->setex($key, $time, $val);

}

public function set($key, $val)

{

return $this->redis->set($key, $val);

}

public function get($key)

{

return $this->redis->get($key);

}

public function expire($key = null, $time = 0)

{

return $this->redis->expire($key, $time);

}

public function psubscribe($patterns = array(), $callback)

{

$this->redis->psubscribe($patterns, $callback);

}

public function setOption()

{

$this->redis->setOption(\Redis::OPT_READ_TIMEOUT, -1);

}

}

过期事件的订阅:

psubscribe.phprequire_once './Redis.class.php';

$redis = new \Redis2();

// 解决Redis客户端订阅时候超时情况

$redis->setOption();

$redis->psubscribe(array('__keyevent@0__:expired'), 'keyCallback');

// 回调函数,这里写处理逻辑

function keyCallback($redis, $pattern, $chan, $msg)

{

echo "Pattern: $pattern\n";

echo "Channel: $chan\n";

echo "Payl

oad: $msg\n\n";

//keyCallback为订阅事件后的回调函数,这里写业务处理逻辑,

//比如前面提到的商品不支付自动撤单,这里就可以根据订单id,来实现自动撤单

}

设置过期事件:

index.phprequire_once './Redis.class.php';

$redis = new \Redis2();

$order_id = 123;

$redis->setex('order_id',10,$order_id);

先用命令行模式执行 psubscribe.php

在浏览器访问index.php

效果如下:

更多相关php知识,请访问php教程!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/349449.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

bjd luts_BJD娃娃背后的圈层文化:一个“成品娃”拍出22万元天价!

■ 作者 黑马君 | 黑马品牌(ID:heimapinpai)现如今“Z世代”已经成为品牌营销中不可忽略的一个关键词,作为消费升级浪潮的主力军,他们早已成为品牌重点目标人群。与90后、80后不同,Z世代成长于互联网迅猛发展的时代,追…

javaweb 需要对表格建立实体类吗_如何采用java界面编程建立一个表格

5.总体代码:为了便于大家复制,下面给出完整的程序代码,如下:package ArrayCreateTable;import javax.swing.table.*;import java.awt.BorderLayout;import java.awt.GridLayout;import javax.swing.*;public class ArrayCreateTab…

qtcreator版本_【IDE】ROS开发环境之Qt Creator的安装与配置

可以用于ROS开发的IDE很多(可以参考【工具合辑】ROS工程师都在用什么IDE开发呢?用哪种IDE开发更加高效呢? ),ROS的调试依赖环境变量,与外部程序有通讯,因此要求启动IDE的时候加载ROS环境参数,其他方面并无太…

基本API速率限制

您可能正在开发某种形式的(Web / RESTful)API,并且如果它是面向公众的(甚至是内部的),通常您希望以某种方式对其进行速率限制。 即,限制一段时间内执行的请求数,以节省资源并防止滥用…

无人值守安装之cdrom_无人值守安装

第一阶段项目内容:内容配置PXEDHCPvsftp,实现客户端网络安装linux操作系统阶段目的:目的是让你体验如何通过网络引导,安装redhat系统,解决了很多时候没有光驱,却需要装系统的需求。步骤:服务器端…

python函数定义中参数列表里的参数是_python函数参数中的/和*是什么意思?

在python3.8之后函数参数中允许出现/和*号,/用来指明某些函数形参必须使用位置参数而非关键字参数的形式,*出现在函数参数中第一种含义可以表示为可变参数,一般写作*args;对于单独出现在参数中的*参数,则表示&#xff…

python属性和方法的区别_Python中几种属性访问的区别

起步 python的提供一系列和属性访问有关的特殊方法:__get__, __getattr__, __getattribute__, __getitem__ 。本文阐述它们的区别和用法。 属性的访问机制 一般情况下,属性访问的默认行为是从对象的字典中获取,并当获取不到时会沿着一定的查找…

rootfs 制作ubuntu_为n1制作aarcm64/arm64 ubuntu rootfs系统

安装debootstrap和qemu-user-static:apt install apt-transport-https qemu qemu-user-static binfmt-support debootstrap构建ubuntu 18.04系统,基础包为minbase,使用清大的源:qemu-debootstrap --arch arm64 --variantminbase -…

java线程死锁_Java并发:隐藏线程死锁

java线程死锁大多数Java程序员熟悉Java线程死锁概念。 它本质上涉及2个线程,它们彼此永远等待。 这种情况通常是平面(同步)或ReentrantLock(读或写)锁排序问题的结果。 Found one Java-level deadlock:"pool-1-t…

空间滤波_第三章 灰度变换与空间滤波-(六)锐化空间滤波器之非锐化掩蔽

知识使人自由,印刷术使知识自由。按照书中的顺序,我们插入一章非微分模式下的锐化的方法,非锐化掩蔽。这种方法在印刷术和出版界已经用了好多年了,具体的过程:模糊原图像从原图像中减去模糊图像(产生的差值…

python gui编程 从入门到项目实战_python GUI编程 QT5开发项目实战

目录:├─01-PyQT简介及优势├─02-PyQT5开发环境搭建├─03-PyQT5应该学什么├─04-PyQT5库结构├─05-PyQT5程序基本结构分析├─06-PyQT5-Pycharm活动模板设置├─07-PyQT5程序基本结构-面向对象版本├─08-PyQT5-控件初体验及学习思路├─09-PyQT5-Object-对象的…

五分钟的JShell

这篇文章建立在我的My Java 9顶级功能文章的基础上,通过对这些功能的深入研究。 在这里,我们向您展示如何在五分钟内学习jshell并改善Java 9开发经验。 入门 假设您已经下载并安装了Java 9,则可以通过键入以下内容启动Shell: js…

gsoap初始化释放_通过gsoap使用webservice

一. 按照原来预研究的结果,使用gsoap的方法如下:soapcpp2.exe -C weather.h -I E:\temp\gsoap-2.8\gsoap\import(E:\temp\gsoap-2.8\gsoap\import是我本地的路径),这样可以生成C文件(soapClient.cpp, soapH.h, soapStub.h, WeatherWebServiceSoap.nsmap)…

go语言io reader_【已解决】go语言中如何使用io的MultiWriter

【背景】折腾:期间,需要去搞懂:如果新建和设置MultiWriter。【折腾过程】1.参考:去看看:2.然后去试试代码:var filenameOnly stringfilenameOnly GetCurFilename()fmt.Println("filenameOnly", …

python声明编码为gbk_Python字符串编码坑彻底详细解决

来源:实习僧 作者:实习僧的何梁 真正完全搞清楚Python的编码问题 我想大家经常被Python的编码问题搞的晕头转向,下面我一头来自实习僧的牛,为您详细解析这个天坑: 请看图: 1、python中一切皆对象,字符对象分…

golang 包含文本_Golang教程之Web篇(七)

首先,大家一起思考一个问题:何为Web编程?严格来说,这只是一个叫法,并没有学术上的定义,但是一般大家都说到web都是指浏览器相关,所以大家一般说的web开发要么是PC Web要么就是手机Web&#xff0…

junit 测试 异常_使用JUnit规则测试预期的异常

junit 测试 异常这篇文章展示了如何使用JUnit测试预期的异常。 让我们从我们要测试的以下类开始: public class Person {private final String name;private final int age;/*** Creates a person with the specified name and age.** param name the name* param …

delphi switch语句例子_Java 14 祭出增强版 switch,真香!!

Java14:栈长,我还有机会吗?栈长:必须有!今天说下switch!关注Java技术栈的朋友应该都知道,switch 在 JDK 12 中进行增强了,并且在 JDK 12/13 中一直是预览特性,刚出来的时…

呼叫我,或异步REST

本文是使用Spring Boot Java 8进行的异步REST应用程序工作的非常简单的示例。SpringBoot使Web应用程序的开发几乎非常容易,但是为了简化任务,我从Spring存储库中举了一个例子,称为rest- service ,将其分叉到我自己的存储库中 &am…

python中break可以用在for和if中吗_Python的for和break循环结构中使用else语句的技巧...

在Python中的while或者for循环之后还可以有else子句,作用是for循环中if条件一直不满足,则最后就执行else语句。 1 2 3 4 5 6 7 8 9 10 11 for iin range(5): if i 1: print in for else: print in else print after for-loop # in for # in else # after…