zoukankan      html  css  js  c++  java
  • phalcon使用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(子命令参数)
      • 返回:由活跃频道组成的列表
      • 子命令如下
      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()方法,这里就暂不介绍了
    有罪是符合人性的,但长期坚持不改就是魔鬼。
  • 相关阅读:
    每日记载内容总结33
    华为机试-尼科彻斯定理
    华为机试-求最大连续bit数
    华为机试-合法IP
    华为机试-票数统计
    华为机试-等差数列
    华为机试-自守数
    中序表达式转后序表式式
    华为机考 给你一个N*M的矩阵,每个位置的值是0或1,求一个面积最大的子矩阵,这个矩阵必须是一个正方形,且里面只能由1构成,输出最大的正方形边长。其中n,m<=400;
    华为机试-求解立方根
  • 原文地址:https://www.cnblogs.com/yu-yuan/p/10057422.html
Copyright © 2011-2022 走看看