Redis 发布订阅(pub/sub)是一种消息通讯模式:发送者(pub)发送消息,订阅者(sub)接收消息。php
subcommand | argument | 说明 |
---|---|---|
CHANNELS | [pattern] | 返回指定模式pattern的活跃的频道,指定返回由SUBSCRIBE订阅的频道 |
NUMSUB | channel channel2 ... | 返回指定频道的订阅数量 |
NUMPAT | 返回订阅模式的数量,注意:这个命令返回的不是订阅模式的客户端的数量, 而是客户端订阅的全部模式的数量总和 |
redis发布订阅功能用于消息的传输;redis发布订阅机制包含3个部分:发布者,订阅者,channel(频道)
发布者和订阅者都是redis客户端,channel是redis服务器端,发布者将消息发布到某一频道上,订阅了这一频道的订阅者就会收到该条信息。redis
如上图所示,左侧的订阅了知足sub*的频道,中间和右侧的分别用sub1,sub2频道发送了一条信息,左侧成功接收到频道sub1,sub2发送过来的信息;这就是最经常使用的redis发布订阅。shell
实例一: 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"
订阅的方法 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"