Redis发布订阅(pub/sub)命令介绍

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(子命令参数)
  • 返回:由活跃频道组成的列表
  • 子命令如下
subcommandargument说明
CHANNELS[pattern]返回指定模式pattern的活跃的频道,指定返回由SUBSCRIBE订阅的频道
NUMSUBchannel channel2 …返回指定频道的订阅数量
NUMPAT返回订阅模式的数量,注意:这个命令返回的不是订阅模式的客户端的数量, 而是客户端订阅的所有模式的数量总和

二:Redis发布订阅架构

redis发布订阅功能用于消息的传输;redis发布订阅机制包含3个部分:发布者,订阅者,channel(频道)

redis发布订阅架构图
在这里插入图片描述

发布者和订阅者都是redis客户端,channel是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()方法,这里就暂不介绍了

作者:StimmerLove
链接:https://www.jianshu.com/p/1ff992b01aad
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值