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"