PHP使用Redis的Pub/Sub(发布订阅)命令
1.概念
| 名称 | 含义 |
|---|---|
| channel | 频道:生产者和消费者直接操作的对象 |
| publish | 生产者:向channel发送消息 |
| subscribe | 消费者:订阅一个或多个channel |
| psubscribe | 消费者:匹配订阅一个或多个channel |
| punsubscribe | 退订:匹配退订,无参数则退订全部channel |
| unsubscribe | 退订:退订指定的channel,无参数则退订全部channel |
| pubsub | 列出当前活动channel(至少有一个订阅) |
2.注意事项
1.生产者publish消息时打开一个连接,publish后连接可以立即关闭
2.channel只接收publish发送的消息,自身不存储消息,如果channel没有被订阅,则消息丢弃
3.订阅的消费者需要一直在线,阻塞获取消息,连接断开表示立即退订
3.使用rawCommand命令实现发布订阅
rawCommand是php-redis扩展中提供的命令,可以向redis发送任何原生的命令
1.消费者订阅Subscribe.php
消费者需要创建redis长连接,并且设置set_time_limit和default_socket_timeout,以确保阻塞获取消息过程php不超时,socket连接不超时
<?php
/**
* Created by PhpStorm.
* User: jmsite.cn
* Date: 2019/1/23
* Time: 11:29
*/
//设置php脚本执行时间
set_time_limit(0);
//设置socket连接超时时间
ini_set('default_socket_timeout', -1);
//声明测试频道名称
$channelName = "testPubSub";
$channelName2 = "testPubSub2";
try {
$redis = new Redis();
//建立一个长链接
$redis->pconnect('192.168.75.132', 6379);
//阻塞获取消息
while (true){
//构建命令参数
$param = array('subscribe', $channelName, $channelName2);
//使用call_user_func_array回调执行命令
$ret = call_user_func_array(array($redis, 'rawCommand'), $param);
//如果结果是消息结构
if (isset($ret[0]) && $ret[0] == 'message'){
//输出消息频道和消息内容
echo "channel:".$ret[1].",message:".$ret[2]."\n";
} else {
//没有消息休眠1秒
sleep(1);
}
}
} catch (Exception $e){
echo $e->getMessage();
}
2.生产者发送消息Publish.php
<?php
/**
* Created by PhpStorm.
* User: jmsite.cn
* Date: 2019/1/23
* Time: 11:59
*/
$channelName = "testPubSub";
$channelName2 = "testPubSub2";
//向指定频道发送消息
try {
$redis = new Redis();
$redis->connect('192.168.75.132', 6379);
for ($i=0;$i<5;$i++){
$data = array('key' => 'key'.$i, 'data' => 'testdata');
$param = array('publish', $channelName, json_encode($data));
$ret = call_user_func_array(array($redis, 'rawCommand'), $param);
print_r($ret);
}
} catch (Exception $e){
echo $e->getMessage();
}
3.执行消费者订阅,开始阻塞获取消息php Subscribe.php
4.执行生产者,开始发送消息php Publish.php
php .\Publish.php
22222
#返回执行结果:频道的订阅数量
查看消费者终端
php .\Subscribe.php
channel:testPubSub,message:{"key":"key0","data":"testdata"}
channel:testPubSub,message:{"key":"key1","data":"testdata"}
channel:testPubSub,message:{"key":"key2","data":"testdata"}
channel:testPubSub,message:{"key":"key3","data":"testdata"}
channel:testPubSub,message:{"key":"key4","data":"testdata"}
消费者获取到了生产者发送的消息。
4.直接使用php-redis扩展提供的方法实现发布订阅
1.消费者订阅Subscribe.php
<?php
/**
* Created by PhpStorm.
* User: jmsite.cn
* Date: 2019/1/23
* Time: 11:29
*/
//设置php脚本执行时间
set_time_limit(0);
//设置socket连接超时时间
ini_set('default_socket_timeout', -1);
//声明测试频道名称
$channelName = "testPubSub";
$channelName2 = "testPubSub2";
try {
$redis = new Redis();
//建立一个长链接
$redis->pconnect('192.168.75.132', 6379);
//阻塞获取消息
$redis->subscribe(array($channelName, $channelName2), function ($redis, $chan, $msg){
echo "channel:".$chan.",message:".$msg."\n";
});
} catch (Exception $e){
echo $e->getMessage();
}
2.生产者发送消息Publish.php
<?php
/**
* Created by PhpStorm.
* User: jmsite.cn
* Date: 2019/1/23
* Time: 11:59
*/
$channelName = "testPubSub";
$channelName2 = "testPubSub2";
//向指定频道发送消息
try {
$redis = new Redis();
$redis->connect('192.168.75.132', 6379);
for ($i=0;$i<5;$i++){
$data = array('key' => 'key'.$i, 'data' => 'testdata');
$ret = $redis->publish($channelName, json_encode($data));
print_r($ret);
}
} catch (Exception $e){
echo $e->getMessage();
}
3.执行消费者订阅,开始阻塞获取消息php Subscribe.php
4.执行生产者,开始发送消息php Publish.php
php .\Publish.php
22222
#返回执行结果:频道的订阅数量
查看消费者终端
php .\Subscribe.php
channel:testPubSub,message:{"key":"key0","data":"testdata"}
channel:testPubSub,message:{"key":"key1","data":"testdata"}
channel:testPubSub,message:{"key":"key2","data":"testdata"}
channel:testPubSub,message:{"key":"key3","data":"testdata"}
channel:testPubSub,message:{"key":"key4","data":"testdata"}
消费者同样获取到了生产者发送的消息。
退订和查看活动channel命令与生产者和消费者类似,只是参数不同而已。
原文地址: https://www.jmsite.cn/blog-586.html
PHP使用Redis的Pub/Sub(发布订阅)命令的更多相关文章
- 第三百零一节,python操作redis缓存-管道、发布订阅
python操作redis缓存-管道.发布订阅 一.管道 redis-py默认在执行每次请求都会创建(连接池申请连接)和断开(归还连接池)一次连接操作,如果想要在一次请求中指定多个命令,则可以使用pi ...
- Redis进阶篇:发布订阅模式原理与运用
"65 哥,如果你交了个漂亮小姐姐做女朋友,你会通过什么方式将这个消息广而告之给你的微信好友?" "那不得拍点女朋友的美照 + 亲密照弄一个九宫格图文消息在朋友圈发布大肆 ...
- Redis(十):pub/sub 发布订阅源码解析
谈到发布订阅模式,相信不会陌生,典型的观察者模式的实现.然而从表面来看,本地实现一个wait/notify通知.register/update调用, 实现一个远程mq服务, 还有本文说的 pub/su ...
- redis pub/sub 发布订阅
Redis的列表数据结构有blpop和brpop命令,能从列表里返回且删除第一个(或最后一个)元素,或者被堵塞,直到有一个元素可供操作.这可以用来实现一个简单的队列.(参考:http://www.cn ...
- Redis学习笔记8--Redis发布/订阅
发布订阅(pub/sub)是一种消息通信模式,主要的目的是解耦消息发布者和消息订阅者之间的耦合,这点和设计模式中的观察者模式比较相似.pub /sub不仅仅解决发布者和订阅者直接代码级别耦合也解决两者 ...
- Redis基础知识 之——发布/订阅
一.说明: 订阅,取消订阅和发布实现了发布/订阅消息范式(引自wikipedia),发送者(发布者)不是计划发送消息给特定的接收者(订阅者).而是发布的消息分到不同的频道,不需要知道什么样的订阅者订阅 ...
- Redis(二)-- 发布订阅、事务、安全、持久化
一.Redis发布订阅 Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息. 打开两个窗口:session1 和 session2 在sess ...
- redis(四)----发布订阅
发布订阅(pub/sub)是一种消息通信模式,主要的目的是解耦消息发布者和消息订阅者之间的耦合.pub /sub不仅仅解决发布者和订阅者直接代码级别耦合,也解决两者在物理部署上的耦合.废话不多说,直接 ...
- Spring Boot使用Redis进行消息的发布订阅
今天来学习如何利用Spring Data对Redis的支持来实现消息的发布订阅机制.发布订阅是一种典型的异步通信模型,可以让消息的发布者和订阅者充分解耦.在我们的例子中,我们将使用StringRedi ...
随机推荐
- 个人收集的Android开源项目
1. KnowWeather 下载:GitHub 一款 Android 开源天气 App ,包含天气信息.详情.生活指数等,通知栏,桌面小部件,定时更新天气等等,应用没有任何广告,支持县级.区级城市的 ...
- nodejs中使用cheerio爬取并解析html网页
nodejs中使用cheerio爬取并解析html网页 转 https://www.jianshu.com/p/8e4a83e7c376 cheerio用于node环境,用法与语法都类似于jquery ...
- 两行命令查看自己笔记本连接的wifi密码
打开cmd.exe窗口 第一行命令 netsh wlan show profiles 可以查看所有曾经连接过的wifi 第二命令 netsh wlan show profiles "vivo ...
- 两个字符串对比提升比较性能用 StringComparison.OrdinalIgnoreCase
如果用string.ToLower() 或者 string.ToUpper()字符串在进行大小写转换时会消耗额外的性能 用这个比较性能更好 StringPwd1.Equals(Md5(PassWord ...
- Heartbeat took longer than "00:00:01" at "09/06/2019 05:08:08 +00:00".
.netcore在k8s+docker+linux,部署后,偶尔会报这样的警告 Warn:Microsoft.AspNetCore.Server.KestrelHeartbeat took longe ...
- vue create xxx 报错
在创建项目的时候,无论是默认配置还是自定义的配置,都会出现如下报错: 不用说,看项目中也只有一个packgge.json文件,项目必然是没有创建成功. 查看淘宝镜像 npm config get re ...
- 为什么0x00400000是可执行文件的默认基址?EXE base address start with 400000H,Why is 0x00400000 the default base address for an executable?
DLL的默认基址是0x10000000,但EXE的默认基址是0x00400000.为什么EXE特别值?4 兆字节有什么特别之处它与x86上单页目录条目映射的地址空间量和1987年的设计决策有关.对EX ...
- 经常开车的朋友必备 它是你的GPS
经常开车的朋友肯定知道,每天都要查下当天的限行尾号,还有哪条路拥堵.还有,最不想发生的事儿就是车子快没油的时候,附近查不到加油站. 现在用这款小程序,可以轻松解决上述这些头痛的事情.扫描下面二维码,进 ...
- 【转】深入理解javascript中的立即执行函数(function(){…})()
javascript和其他编程语言相比比较随意,所以javascript代码中充满各种奇葩的写法,有时雾里看花,当然,能理解各型各色的写法也是对javascript语言特性更进一步的深入理解. ( f ...
- 【剑指offer】1+….+n,不能使用相关关键字
题目描述 求1+2+3+...+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B:C). 分析:可以使用递归! class Soluti ...