phalcon使用Redis發佈訂閱(pub/sub)命令介紹

Redis 發佈訂閱(pub/sub)是一種消息通訊模式:發送者(pub)發送消息,訂閱者(sub)接收消息。php

一:命令介紹

  • 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

    三:使用介紹

    redis訂閱實例
    如上圖所示,左側的訂閱了知足sub*的頻道,中間和右側的分別用sub1,sub2頻道發送了一條信息,左側成功接收到頻道sub1,sub2發送過來的信息;這就是最經常使用的redis發佈訂閱。shell

    四: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()方法,這裏就暫不介紹了
相關文章
相關標籤/搜索