当前位置:首页 > PHP > 正文内容

redis订阅和发布,redis消息订阅与发布, phpredis订阅和发布

高老师7年前 (2019-03-29)PHP1415

Redis提供了发布订阅功能,可以用于消息的传输,Redis的发布订阅机制包括三个部分,发布者(publisher),订阅者(subscriber)和频道(channel)。 

发布者和订阅者都是Redis客户端,Channel则为Redis服务器端,发布者将消息发送到某个的频道,订阅了这个频道的订阅者就能接收到这条消息。

关系图如下:

20170415153941123.png

【一】.现在模拟下发布消息到对应频道,订阅对应频道接收消息。假设我们现在有一个名为FM88.7的redis频道(哈哈,这是中国国际广播电台的频道)

    (1). Redis采用SUBSCRIBE命令订阅某个频道。现在我们订阅下FM88.7频道,命令是:SUBSCRIBE 频道名称   (可以多开几个命令行窗口当做是多个人订阅这个频道),其返回值包括客户端订阅的频道,目前已订阅的频道数量,以及接收到的消息,其中subscribe表示已经成功订阅了某个频道。

SUBSCRIBE FM88.7    //执行后窗口一直挂起在接收频道信息

  

    (2). Redis采用PUBLISH命令发送消息到对应频道。现在我们发送消息到FM88.7,让订阅的人都收到,命令为:PUBLISH  频道名称   消息内容   ,其返回值为接收到该消息的订阅者的数量。

PUBLISH   FM88.7  "welcome to fm88.7"  //返回2,因为在第一步我开启了2个窗口,相当于2个人订阅这个频道

    (3). 从上面来看,我们必须要知道这个频道才能去收听频道的内容,那我能不能和FM收音机一样支持自动搜索呢?支持的,Redis提供Psubscribe 命令订阅一个或多个符合给定模式的频道。每个模式以 * 作为匹配符。警告:如果你使用普通订阅和这个匹配订阅同时订阅一个频道,这个频道的消息你每次都会收到2条,只不过这两条消息的类型不同,一个是message类型,一个是pmessage类型,但其内容相同。

Psubscribe *  //订阅所有频道
Psubscribe news*  //订阅所有以news开头的频道

    (4). 退订频道命令是:

UNSUBSCRIBE   频道名称   //单个退订
UNSUBSCRIBE   *   //全部退订
UNSUBSCRIBE   news*   //退订所有以news开头的频道

【二】.PHP代码实现。由于订阅频道后客户端是阻塞的接收信息,所以订阅者都是以cli模式运行。

    (1).redis.php:连接redis,返回redis对象

<?php
($redis = new Redis())->connect('127.0.0.1', 6379);

    (2)sub.php:订阅者,开启2个cli运行

<?php
include './redis.php';
global $redis;

/**
 * 参数1: 传递需要订阅的频道数组,支持多个
 * 参数2: 传递回调函数
 */
$redis->subscribe(['FM88.7'],function (Redis $instance, $channel, $message){
    echo '频道:'.$channel.PHP_EOL;
    echo '消息:'.$message.PHP_EOL;
});

    (3)pub.php:发布者

<?php
include './redis.php';
global $redis;

/**
 * 参数1: 频道名称
 * 参数2: 频道消息
 */
$result = $redis->publish('FM88.7', 'welcome to fm88.7');

扫描二维码推送至手机访问。

版权声明:本文由高久峰个人博客发布,如需转载请注明出处。

本文链接:https://blog.20230611.cn/post/80.html

分享给朋友:

“redis订阅和发布,redis消息订阅与发布, phpredis订阅和发布” 的相关文章

PHP生成缩略图

PHP生成缩略图

//参数1  文件名    参数2  缩放比例  function   _thumb($_filename,$_percent){    ob_clean();...

php引用变量的完全理解

php引用变量的完全理解

在PHP中,大部分变量类型,如字符串,整型,浮点,数组等都是值类型的,而类和对象是引用类型.和其他语言有点差距.(1).在值类型中我们直接使用&符号表示指向对应变量的内存地址,当前变量和被指向的变量只要有1个的值被修改都会直接影响另外一个变量的值发生变化。(ps:还是非常节省内存的,可以使用...

php异步执行,php后台运行,如何在windows下让php后台运行

php异步执行,php后台运行,如何在windows下让php后台运行

如果想在windows中执行php,并且让php脚本在后台运行,可以用下面的cmd命令start /b php  D:\wwwroot\default\demo1\run.php例如上面的命令意思后台运行run.php,如果想用php编写异步代码: ...

PHP中的ArrayAccess用法详解

PHP中的ArrayAccess用法详解

php arrayaccess 官方的说法是让你能以数组的形式访问对象,对于这种php内置接口一直不太明白有什么用,坚持多看文章,终于理解,特来分享,思路不同,更易于理解。(1).创建一个学生类,并且实现arrayaccess 接口。<?php class  studen...

【二】PHP多进程学习-进程信号管理

【二】PHP多进程学习-进程信号管理

(1).学习目标:    了解常见信号类型(百度PHP支持的信号类型),(2).相关函数学习:    (2.1).pcntl_signal函数用于设置一个信号管理器接收进程信号,参数1:信号类型,参数2:回调函数,用于在接收到参数1类型的信...

composer自动加载类库(非psr4规范的文件)

composer自动加载类库(非psr4规范的文件)

在项目下的composer配置文件修改(PaySdk是我这里一个支付sdk的目录,包含各种各样的支付sdk,这样写的意思让composer自动把PaySdk下的所有文件自动加载):"autoload": {      &...