php订阅系统,php redis pub/sub(Publish/Subscribe,发布/订阅的信息系统)之基本使用

一.场景介绍

最近的一个项目需要用到发布/订阅的信息系统,以做到最新实时消息的通知。经查找后发现了redis pub/sub(发布/订阅的信息系统)可以满足我的开发需求,而且学习成本和使用成本也比较低。

二.什么是redis pub/sub

资料查看

大家在看我的blog的同时可以打开redis官方对于redis pub/sub的介绍,感觉看英文文档吃力的话 :cry: ,可以看redis中文网的翻译介绍.

Pub/Sub功能(means Publish, Subscribe)即发布及订阅功能

基于事件的系统中,Pub/Sub是目前广泛使用的通信模型,它采用事件作为基本的通信机制,提供大规模系统所要求的松散耦合的交互模式:订阅者(如客户端)以事件订阅的方式表达出它有兴趣接收的一个事件或一类事件;发布者(如服务器)可将订阅者感兴趣的事件随时通知相关订阅者。

消息发布者,即publish客户端,无需独占链接,你可以在publish消息的同时,使用同一个redis-client链接进行其他操作(例如:INCR等)

消息订阅者,即subscribe客户端,需要独占链接,即进行subscribe期间,redis-client无法穿插其他操作,此时client以阻塞的方式等待“publish端”的消息;这一点很好理解,因此subscribe端需要使用单独的链接,甚至需要在额外的线程中使用。三.redis pub sub(publish subscribe)之基本使用

下面我将配着实图(用我的本地机器环境)来为大家讲解redis的pub/sub怎么去使用 .

没有安装phpredis扩展的或者没有redis服务的,请参考我的 另一篇blog ,有详细的安装介绍,这里不再赘述了。

1、启动redis服务端

302bad67f9dda864b7616bad5169f95e.gif

DSC0000.jpg (74.7 KB, 下载次数: 39)

2017-12-22 07:35 上传

2、启动redis客户端,并做为subscribe订阅端

新开一个终端,启动redis客户端,并做为subscribe客户端(消息订阅者),订阅一个名字叫test的频道信息:

302bad67f9dda864b7616bad5169f95e.gif

DSC0001.jpg (55.64 KB, 下载次数: 40)

2017-12-22 07:35 上传

3、启动redis客户端,并做为publish客户端

发布一个名字叫test的频道,信息是:hello,world

302bad67f9dda864b7616bad5169f95e.gif

DSC0002.jpg (41.91 KB, 下载次数: 36)

2017-12-22 07:35 上传

4、查看订阅到的消息

再切换到2步骤中的redis客户端窗口,会发现,已经订阅到了刚才发布的 'hello,world'消息:

302bad67f9dda864b7616bad5169f95e.gif

DSC0003.jpg (64.59 KB, 下载次数: 36)

2017-12-22 07:35 上传

其中,test为频道名称,hello,world即为消息

5、模式匹配订阅

Redis 的Pub/Sub实现支持模式匹配。

客户端可以订阅全风格的模式以便接收所有来自能匹配到给定模式的频道的消息。 比如,将接收所有发到 test.name,test.phone,test.address...等等的消息,该这样写:

PUBSCRIBE test.*

在终端回车后,同时再新的窗口里分别发布两个频道的消息,名字分别为:test.name和test.phone,然后切换到订阅端的窗口里,结果如下图所示:

302bad67f9dda864b7616bad5169f95e.gif

DSC0004.jpg (82.85 KB, 下载次数: 37)

2017-12-22 07:35 上传

由上图可以看出,在订阅了test.*频道后,一共收到了 test.name和test.phone两个频道的消息,这就是模式匹配订阅。

那么取消订阅匹配该模式的客户端也比较简单:

PUNSUBSCRIBE test.*

好,以上的这些简单的demo,就是关于redis pub/sub(Publish/Subscribe,发布/订阅的信息系统)的最基本使用。说了这么多,跟php也没有挂上什么钩,别着急,重要的都往往最后出场。

四.php redis pub/sub

phpredis的安装

redis的客户端连接支持多种语言。这里我用的是php的phpredis,它是用c语言编写的,目前已经作为php的一个模块扩展,没有安装的可以参考我的 另一篇blog ,已经安装的可以忽略此步骤.

命令手册

详细请看github 这里 。 这里我列出一些常用的:

Redis::__construct构造函数

$redis = new Redis();

connect, open 链接redis服务

参数

host: string,服务地址

port: int,端口号

timeout: float,链接时长 (可选, 默认为 0 ,不限链接时间)

注: 在redis.conf中也有时间,默认为300

pconnect, popen 不会主动关闭的链接

参考上面

setOption 设置redis模式

getOption 查看redis设置的模式

ping 查看连接状态

get 得到某个key的值(string值)

如果该key不存在,return false

set 写入key 和 value(string值)

如果写入成功,return ture

setex 带生存时间的写入值

$redis->setex('key', 3600, 'value'); // sets key → value, with 1h TTL.

setnx 判断是否重复的,写入值

$redis->setnx('key', 'value');

$redis->setnx('key', 'value');

delete 删除指定key的值

返回已经删除key的个数(长整数)

$redis->delete('key1', 'key2');

$redis->delete(array('key3', 'key4', 'key5'));

更详细的使用请参考这里 ,我就不写太多,因为我要直接摞代码了.

publish(消息发布端):pub.php

/**  * redis sub(消息订阅端)

* @ blog: phping.sinaapp.com

* @date 2016-04-24 15:00

*/

$redis = new Redis();

// 第一个参数为redis服务器的ip,第二个为端口

$res = $redis->connect('127.0.0.1', 6379);

// test为发布的频道名称,hello,world为发布的消息

$res = $redis->publish('test','hello,world');

subscribe(消息订阅端): sub.php

/**  * redis sub(消息订阅端)

* @ blog: phping.sinaapp.com

* @date 2016-04-24 15:00

*/

$redis = new Redis();

$res = $redis->pconnect('127.0.0.1', 6379,0);

$redis->subscribe(array('test'), 'callback');

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

function callback($instance, $channelName, $message) {

echo $channelName, "==>", $message,PHP_EOL;

}

开始订阅redis消息

前面已经提到过,消息订阅者,即subscribe客户端,需要独占链接,即进行subscribe期间,redis-client无法穿插其他操作,此时client以阻塞的方式等待“publish端”的消息,所以我们用命令行来执行:

php启动redis订阅端

则 订阅消息的redis客户端已经启动,随时等待发布过来的消息并订阅该消息. 发布redis消息 同样,命令行执行消息发布端的脚本即可:

php pub.php

切换到消息订阅端的窗口

发现终端有输出,如下图

302bad67f9dda864b7616bad5169f95e.gif

DSC0005.jpg (21.7 KB, 下载次数: 39)

2017-12-22 07:35 上传

哈哈,是不是 收到了发布端发布的'hello,world'这条消息呢。

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

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

相关文章

SQL Server 自定义函数 返回树结构函数

数据库结构: 表内的数据: 自定义函数: 递归查出 树下所有节点 ,参数是 父idcreate function sss(id as int)returns t table(id int not null,name int not null,pid int null)asbegindeclare lay as int;insert into t select * from tree where pid id;select lay min(id) …

php 生成器作用,php 生成器的理解和使用

image.png开头介绍的这个文章总结的很详细,而且大多的介绍其实都是这么写的,也是这些例子。但是手册的介绍也很重要。此处,我主要写一些个人的理解要点1.生成其是一种更容易实现简单对象迭代。所以他的本质其实是相当于有助于更好的实现 fore…

哪里学php开发,哪里学web开发

在开始学习Web开发时,我建议做的第一件事就是确定明确的最终目标,并牢记其中。也许你想改变职业生涯。也许你对应用程序有一个邪恶的想法。或许你只是想学习乐趣。无论您的目标是什么,了解您为什么这样做都很重要。这种理解将帮助您提高学习时…

前端学习(590):调试javascript的流程

vs 安装live server插件 第一种方式 第二种方式 使用alert 断点调试debugger 断点调试 断点调试 设置断点

统一管理MOSS2010用户头像

我们都知道MOSS 2010里面的“我的网站”里面有一个上传照片功能,通过那里用户可以方便的上传自己的照片。也可以通过在AD里面上传用户的头像,通过MOSS的 User Profile Service Application 服务进行同步,实现MOSS,Outlook,Lync 头像的统一管理…

php 判断心跳包报错,第29问:MySQL 的复制心跳说它不想跳了

问题最近年末,你们的数据库常常跑批量大事务,会发现复制忽然断开,报错“心跳与本地信息不兼容”: 会是什么缘由?php 实验咱们先来复现一下,再进行分析。html宽油,作一对主从数据库:m…

Linux 常用测试命令

1. cpu info: 2. memory info 3. 下载测试:这里有测试下载文件:wget http://cachefly.cachefly.net/100mb.test 4. 磁盘性能:命令:dd if/dev/zero oftest bs64k count4k oflagdsync 5. cpu负载信息命令:uptime解释: 3个…

UVa11137 Ingenuous Cubrency

原题传送:http://uva.onlinejudge.org/external/111/11137.html 递推,动态规划。 d[i][j]表示使用不超过i的 i 的整数的立方,累加和为 j 的方案数。 则有状态转移方程: d[i][j] d[i - 1][j] d[i][j - i3]。 初始条件d[0][0] 1;…