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命令与生产者和消费者类似,只是参数不同而已。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
PHP使用Redis的GEO(地理位置)命令
相关笔记:CentOS6.9源码编译安装redis和php-redis扩展我喜欢爬山,学习GEO的时候我也以山的坐标做演示,我的坐标是:116.517159,39.922267我整理了一些山的坐标 $mountainCoordinates = array( array('115.793844', '40.584459', 'Hai_tuo'),//海陀山坐标 array('115.056232', '39.948933', 'Small_wutai'),//小五台山坐标 array('114.173822', '27.474563', 'Wu_gong'),//武功山坐标 array('111.341648', '25.518178', 'Leek_ridge'),//韭菜岭坐标 array('103.901761', '31.60487', 'Jiu_ding'),//九顶山坐标 array('107.398009', '34.057777', 'Ao_Shan'),//鳌山坐标 ); 1.向mountainCoordinates的key里增加坐标 try { $redis = ne...
- 下一篇
PHP使用Redis的Transaction(事务)命令
1.Transaction命令 命令 作用 返回值 watch 监视一个或多个key 总是OK multi 声明事务开始,后续命令将排队按顺序等待exec执行 总是OK exec 顺序执行multi之后的命令,如果multi之前使用watch命令监视的键的值发生变化,执行将失败 执行成功时返回数组包含每个命令执行结果,失败时原生命令返回null,php-redis扩展方法返回false discard 取消事务 总是OK unwatch 取消watch监视,如果watch监视之后执行了exec或discard,会自动取消监视,不必再unwatch 总是OK 2.执行事务 <?php /** * Created by PhpStorm. * User: jmsite.cn * Date: 2019/1/24 * Time: 21:03 */ try { $redis = new Redis(); $redis->connect('192.168.75.132', 6379); //开启事务 $redis->multi(); $redis->setex('keyTe...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8编译安装MySQL8.0.19
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS8安装Docker,最新的服务器搭配容器使用
- SpringBoot2全家桶,快速入门学习开发网站教程
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- CentOS7,8上快速安装Gitea,搭建Git服务器