Redis 发布订阅 (pub/sub) 是一种消息通信模式: 发送者 (pub) 发送消息, 订阅者 (sub) 接收消息.
一: 命令介绍
PSUBSCRIBE pattern [pattern1 ....]
说明: 订阅一个或多个符合给定模式的频道, 每个模式以 * 作为匹配符
参数: pattern(给定的模式)
返回: 接受到的信息
PUNSUBSCRIBE pattern [pattern1 ....]
说明: 用于退订所有给定模式的频道
参数: pattern(给定的模式)
返回: 这个命令在不同的客户端中有不同的表现.
SUBSCRIBE channel [channel1 ...]
说明: 用于订阅给定的一个或多个频道的信息
参数: channel(给定的频道名)
返回: 接收到的信息
UNSUBSCRIBE channel [channel1 ...]
说明: 用于退订给定的一个或多个频道的信息
参数: channel(给定的频道名)
返回: 这个命令在不同的客户端中有不同的表现
PUBLISH channel message
说明: 用于将信息发送到指定的频道
参数: channel(频道名称),message(将要发送的信息)
返回: 接收到此消息的订阅者数量
PUBSUB <subcommand> argument [argument1 ....]
说明: 用于查看订阅与发布系统状态, 它由数个不同格式的子命令组成
参数: subcommand(子命令),argument(子命令参数)
返回: 由活跃频道组成的列表
子命令如下
subcommand | argument | 说明 |
---|---|---|
CHANNELS | [pattern] | 返回指定模式 pattern 的活跃的频道, 指定返回由 SUBSCRIBE 订阅的频道 |
NUMSUB | channel channel2 ... | 返回指定频道的订阅数量 |
NUMPAT | 返回订阅模式的数量,注意:这个命令返回的不是订阅模式的客户端的数量, 而是客户端订阅的所有模式的数量总和 |
二: Redis 发布订阅架构
Redis 发布订阅功能用于消息的传输; Redis 发布订阅机制包含 3 个部分: 发布者, 订阅者, channel(频道)
Redis 发布订阅架构图
发布者和订阅者都是 Redis 客户端, channel 是 Redis 服务器端, 发布者将消息发布到某一频道上, 订阅了这一频道的订阅者就会收到该条信息.
三: 使用介绍
Redis 订阅实例
如上图所示, 左侧的订阅了满足 sub * 的频道, 中间和右侧的分别用 sub1,sub2 频道发送了一条信息, 左侧成功接收到频道 sub1,sub2 发送过来的信息; 这就是最常用的 Redis 发布订阅.
四: phpredis 使用 Redis 发布订阅
subscribe(channels,callback)
说明: 订阅一个或多个频道, 注意: 这个功能未来可能改变
参数: channels(频道名称组成的数组),callback(回调函数: 一个字符串或者一个数组(array($instance,'method_name')), 回调函数包含 3 个参数, Redis 实例名称, 频道名称, 信息)
返回值: 混合类型(由频道发布的信息组成), 回调函数中任何的非空返回值都会返回出来
publish(channel,message)
说明: 发送消息 message 到频道 channel, 注意: 这个功能未来可能改变
参数: channel(频道名称),message(要发送的信息)
实例:
实例一:
sub.PHP
- <?PHP
- $Redis = new \Redis();
- $Redis->connect('10.117.8.188',6379);
- function callbak($rds,$channel_name,$msg){
- var_dump($rds);
- var_dump($channel_name);
- var_dump($msg);
- }
- try{
- $Redis->subscribe(array('sub1','sub2','job1','job2'),'callbak');
- }catch (\Exception $exception){
- echo $exception->getMessage();
- }
- ?>
pub.PHP
- <?PHP
- $Redis = new \Redis();
- $Redis->connect('10.117.8.188',6379);
- $message = rand(101,300);
- $channel = 'sub1';
- $Redis->publish($channel,$message);
- ?>
然后按以下流程执行
1. 在 xshell 的一个窗口下执行: PHP sub.PHP
2. 另开一个 xshell 窗口下执行: PHP pub.PHP
3. 执行完 2 之后, 到 1 的窗口下去看, 出现如下的字符串
- object(Redis)#1 (1) {
- ["socket"]=>
- resource(5) of type (Redis Socket Buffer)
- }
- string(4) "sub1"
- string(3) "201"
实例二:
类中的方法
订阅的方法
- public function subAction(){
- $Redis = new \Redis();
- $Redis->connect('10.117.8.188',6379);
- ini_set('default_socket_timeout', -1);
- $channel = 'sub1';
- $msg = rand(400,700);
- try{
- $Redis->subscribe(['sub1','sub2','job1','job2'],function($r, $c, $m){
- var_dump($r);
- var_dump($c);
- var_dump($m);
- });
- }catch (\Exception $exception){
- var_dump($exception->getMessage());
- }
- }
发布的方法
- public function pubAction(){
- $Redis = new \Redis();
- $Redis->connect('10.117.8.188',6379);
- $message = rand(101,300);
- $channel = 'sub1';
- $Redis->publish($channel,$message);
- }
然后按以下流程执行
1. 在 xshell 的一个窗口下执行: curl http:// 域名 / lives/L06430/comments/sub
2. 另开一个 xshell 窗口下执行: curl http:// 域名 / lives/L06430/comments/pub
3. 执行完 2 之后, 到 1 的窗口下去看, 出现如下的字符串
- object(Redis)#209 (1) {
- ["socket"]=>
- resource(6) of type (Redis Socket Buffer)
- }
- string(4) "sub1"
- string(3) "110"
- pSubscribe(pattern,callback)
说明: 订阅与给定的匹配模式 pattern 相匹配的所有频道(按模式订阅频道)
参数: pattern(给定的模式),callback(回调函数)
返回: 混合类型(由频道发布的信息组成), 回调函数中任何的非空返回值都会返回出来
实例:
订阅的方法
- public function subAction(){
- $Redis = new \Redis();
- $Redis->connect('10.117.8.188',6379);
- ini_set('default_socket_timeout', -1);
- $channel = 'sub1';
- $msg = rand(400,700);
- $pattern = 'sub*';
- try{
- $Redis->subscribe([$pattern],function($r, $pattern, $c, $m){
- var_dump($r);
- var_dump($c);
- var_dump($m);
- });
- }catch (\Exception $exception){
- var_dump($exception->getMessage());
- }
- }
发布的方法
- public function pubAction(){
- $Redis = new \Redis();
- $Redis->connect('10.117.8.188',6379);
- $message = rand(101,300);
- $channel = 'sub1';
- $Redis->publish($channel,$message);
- }
然后按以下流程执行
1. 在 xshell 的一个窗口下执行: curl http:// 域名 / lives/L06430/comments/sub
2. 另开一个 xshell 窗口下执行: curl http:// 域名 / lives/L06430/comments/pub
3. 执行完 2 之后, 到 1 的窗口下去看, 出现如下的字符串
- object(Redis)#209 (1) {
- ["socket"]=>
- resource(6) of type (Redis Socket Buffer)
- }
- string(4) "sub1"
- string(3) "151"
- pubSub(keywords,argument)
说明: 用于获取 Redis 订阅或者发布信息的状态
参数: keywords(包括: channels,numsub,numpat),argument(可选项, 具体参数与 keywords 相对应)
返回: keywords 为 CHANNELS 时, 返回满足给定模式 argument 的所有频道, 并组成数组; keywords 为 NUMSUB 时, 返回指定频道 argument 的订阅数量组成的关联数组; keywords 为 NUMPAT 时, 返回订阅模式的数量.
注意: phalcon 框架暂时不能使用 pubSub()方法, 这里就暂不介绍了
来源: http://www.jianshu.com/p/1ff992b01aad