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

一.场景介绍

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

二.什么是redis pub/sub

资料查看

你们在看个人blog的同时能够打开redis官方对于redis pub/sub的介绍,感受看英文文档吃力的话 :cry: ,能够看redis中文网的翻译介绍.nginx

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

  1. 基于事件的系统中,Pub/Sub是目前普遍使用的通讯模型,它采用事件做为基本的通讯机制,提供大规模系统所要求的松散耦合的交互模式:订阅者(如客户端)以事件订阅的方式表达出它有兴趣接收的一个事件或一类事件;发布者(如服务器)可将订阅者感兴趣的事件随时通知相关订阅者。
  2. 消息发布者,即publish客户端,无需独占连接,你能够在publish消息的同时,使用同一个redis-client连接进行其余操做(例如:INCR等)
  3. 消息订阅者,即subscribe客户端,须要独占连接,即进行subscribe期间,redis-client没法穿插其余操做,此时client以阻塞的方式等待“publish端”的消息;这一点很好理解,所以subscribe端须要使用单独的连接,甚至须要在额外的线程中使用。

三.redis pub sub(publish subscribe)之基本使用

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

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

一、启动redis服务端

二、启动redis客户端,并作为subscribe订阅端

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

三、启动redis客户端,并作为publish客户端

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

四、查看订阅到的消息

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

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

五、模式匹配订阅

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

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

PUBSCRIBE test.*

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

由上图能够看出,在订阅了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

切换到消息订阅端的窗口

发现终端有输出,以下图

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

相关文章
相关标签/搜索