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

摘要:
用于订阅一个或多个给定频道的信息参数:用于取消订阅一个给定频道或多个信道的信息参数;由活动通道组成的列表子命令如下:子命令gument。CHANNELS[pattern]返回指定模式的活动信道。左侧订阅满足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服务器端,发布者将消息发布到某一频道上,订阅了这一频道的订阅者就会收到该条信息。

三:使用介绍

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()方法,这里就暂不介绍了

免责声明:文章转载自《phalcon使用Redis发布订阅(pub/sub)命令介绍》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Linux平台下贪吃蛇游戏的运行开源网络备份软件 bacula 的安装、配置和运行下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Java简单的使用redis存、取数据

简单的使用redis存、取数据   首先,redis配置类如下: package org.jeecg.config;import java.lang.reflect.Method;import java.time.Duration;import java.util.Arrays;import javax.annotation.Resource;import...

SpringBoot整合Jedis

一、说明   Spring中可以配置RedisTemplate来操作Redis,但是本文中并没有使用RedisTemplate,而是单纯的使用Spring的IoC,单独创建一个配置类,用来配置Redis,然后在需要进行Redis操作的地方,注入配置的Jedis即可。   也就是说,本文中的内容,单纯地使用Jedis,其实和普通java项目配置Redis并没...

redis开机自动启动服务

一、首先是下载Redis(这里我选择64位)github下载地址:https://github.com/MicrosoftArchive/redis/releases 二、解压压缩包,进入安装目录在空白处按下shift+鼠标右键,打开命令窗口。 三、输入命令执行:redis-server --service-install redis.windows.co...

关于缓存的一些重要概念(Redis 前置菜)

1. 缓存的基本思想 很多朋友,只知道缓存可以提高系统性能以及减少请求相应时间,但是,不太清楚缓存的本质思想是什么。 缓存的基本思想其实很简单,就是我们非常熟悉的空间换时间。不要把缓存想的太高大上,虽然,它的确对系统的性能提升的性价比非常高。 其实,我们在学习使用缓存的时候,你会发现缓存的思想实际在操作系统或者其他地方都被大量用到。 比如CPU Cache...

Redis有效时间设置及时间过期处理

本文对redis的过期处理机制做个简单的概述,让大家有个基本的认识。Redis中有个设置时间过期的功能,即对存储在redis数据库中的值可以设置一个过期时间。作为一个缓存数据库,这是非常实用的。如我们一般项目中的token或者一些登录信息,尤其是短信验证码都是有时间限制的,按照传统的数据库处理方式,一般都是自己判断过期,这样无疑会严重影响项目性能。一、有效...

redis启动出错Creating Server TCP listening socket 127.0.0.1:6379: bind: No error

windows下安装Redis第一次启动报错: [2368] 21 Apr 02:57:05.611 # Creating Server TCP listening socket 127.0.0.1:6379: bind: No error 解决方法:在命令行中运行 redis-cli.exe 127.0.0.1:6379>shutdown not...