Redis基本使用 之——发布/订阅

一、说明:

订阅,取消订阅和发布实现了发布/订阅消息范式(引自wikipedia),发送者(发布者)不是计划发送消息给特定的接收者(订阅者)。而是发布的消息分到不同的频道,不需要知道什么样的订阅者订阅。订阅者对一个或多个频道感兴趣,只需接收感兴趣的消息,不需要知道什么样的发布者发布的。这种发布者和订阅者的解耦合可以带来更大的扩展性和更加动态的网络拓扑。

二、发布及订阅功能:

  1. 基于事件的系统中,Pub/Sub是目前广泛使用的通信模型,它采用事件作为基本的通信机制,提供大规模系统所要求的松散耦合的交互模式:订阅者(如客户端)以事件订阅的方式表达出它有兴趣接收的一个事件或一类事件;发布者(如服务器)可将订阅者感兴趣的事件随时通知相关订阅者。
  2. 消息发布者,即publish客户端,无需独占链接,你可以在publish消息的同时,使用同一个redis-client链接进行其他操作(例如:INCR等)
  3. 消息订阅者,即subscribe客户端,需要独占链接,即进行subscribe期间,redis-client无法穿插其他操作,此时client以阻塞的方式等待“publish端”的消息;这一点很好理解,因此subscribe端需要使用单独的链接,甚至需要在额外的线程中使用。

三、PUBLISH端代码:

<?php
/**
 * redis sub(消息订阅端)
 * @date 2016-09-20 15:00
 */
$redis = new Redis();
// 第一个参数为redis服务器的ip,第二个为端口
$res = $redis->connect(‘121.41.88.209‘, 6379);
// test为发布的频道名称,hello,world为发布的消息
$res = $redis->publish(‘test‘,‘hello,world‘.rand(00000,99999));

说明:发布一个名字叫test的频道,信息是:hello,world

四、SUBSCRIBE端代码:

<?php
/**
 * redis sub(消息订阅端)
 * @date 2016-09-20 15:00
 */

$redis = new Redis();
$res = $redis->pconnect(‘121.41.88.209‘, 6379);
$redis->setOption(\Redis::OPT_READ_TIMEOUT,-1);
$redis->subscribe(array(‘test‘), ‘callback‘);

// 回调函数,这里写处理逻辑
function callback($instance, $channelName, $message) {
 echo $channelName, "==>", $message,PHP_EOL;
}
//ThinkPHP 使用public function publish()
    {
        $redis = RedisInstance::getInstance();
        $redis->publish(‘test‘,‘ThinkPHP browser output:‘.date(‘Y-m-d H:i:s‘,time()));
    }

说明:已经订阅到了刚才发布的 ‘ThinkPHP browser output‘消息:

五、遇到的错误代码:

在命令执行redis订阅端脚本时,发现在终端会输出:

PHP Fatal error:  Uncaught exception ‘RedisException‘ with message ‘read error on connection‘ in …

这个错误大概的意思就是遇到了一个未捕获的异常:RedisException,消息读取错误当连接的时候。 应该是redis的客户端读取超时原因导致。 很多人在github上留言能不能提供一个类似php的pconnect的接口,但是貌似redis官方对这个没有一个官方的解决办法。

错误解决办法(以下3种办法):

【1】设置,default_socket_time = -1 但是本机测试的时候,应该是版本不一样的原因,直接报错:

redis server went away

【2】给redis connect的时候( pconnect( $host, $port = 6379, $timeout = 0.0 ))给timeout设置一个较大的值。

【3】通过Redis自带的常量设置

$redis->setOption(Redis::OPT_READ_TIMEOUT, -1);

六、模式匹配订阅

Redis 的Pub/Sub实现支持模式匹配。

客户端可以订阅全风格的模式以便接收所有来自能匹配到给定模式的频道的消息。 比如,将接收所有发到 test.name,test.phone,test.address...等等的消息,该这样写:

PUBSCRIBE test.*

说明:在终端回车后,同时再新的窗口里分别发布两个频道的消息,名字分别为:test.name和test.phone,然后切换到订阅端的窗口里,结果如下图所示:

由上图可以看出,在订阅了test.*频道后,一共收到了 test.name和test.phone两个频道的消息,这就是模式匹配订阅。

那么取消订阅匹配该模式的客户端也比较简单:

PUNSUBSCRIBE test.*

参考地址:http://phping.sinaapp.com/blog/php-redis-sub-pub.html

时间: 2024-10-06 19:02:13

Redis基本使用 之——发布/订阅的相关文章

Redis:八、发布订阅实现原理

Redis:相关内容 Redis发布订阅常用命令1.psubscribe pattern [pattern...]//订阅一个或多个符合给定模式的频道2.pubsub subcommand [argument[argument...]]//查看订阅与发布系统状态3.publish channel message将消息发送到指定的频道4.punsubscribe [pattern [pattern...]]退订所有给行模式的频道5.subscribe channel [channel...]订阅给

redis(4)----发布订阅

  一. redis发布订阅简介         发布订阅(pub/sub)是一种消息通信模式,主要的目的是解耦消息发布者和消息订阅者之间的耦合.pub /sub不仅仅解决发布者和订阅者直接代码级别耦合,也解决两者在物理部署上的耦合. 二. 测试源码     1. 首先启动redis     2. 发布         新建一个Java Project,然后再新建一个class,为其增加main方法来向redis发布消息: package com.luych.message.publish; i

redis学习笔记之发布订阅

发布订阅(pub/sub)是一种消息通信模式,主要的目的是解耦消息发布者和消息订阅者之间的耦合,这点和设计模式中的观察者模式比较相似.pub /sub不仅仅解决发布者和订阅者直接代码级别耦合也解决两者在物理部署上的耦合.redis作为一个pub/sub server,在订阅者和发布者之间起到了消息路由的功能.订阅者可以通过subscribe和psubscribe命令向redis server订阅自己感兴趣的消息类型,redis将消息类型称为通道(channel).当发布者通过publish命令向

Redis 命令参考——PubSub(发布订阅)

PubSub(发布订阅)PUBLISH PUBLISH channel message 将信息 message 发送到指定的频道 channel . 可用版本: >=2.0.0 时间复杂度: O(N+M),其中 N 是频道 channel 的订阅者数量,而 M 则是使用模式订阅(subscribed patterns)的客户端的数量. 返回值: 接收到信息 message 的订阅者数量. # 对没有订阅者的频道发送信息 redis>publish bad_channel "can a

Redis资料汇总(六) 发布订阅

发布订阅(pub/sub)是一种消息通信模式,主要的目的是解耦消息发布者和消息订阅者之间的耦合,这点和设计模式中的观察者模式比较相似. pub /sub不仅仅解决发布者和订阅者直接代码级别耦合也解决两者在物理部署上的耦合.redis作为一个pub/sub server,在订阅者和发布者之间起到了消息路由的功能.订阅者可以通过subscribe和psubscribe命令向redis server订阅自己感兴趣的消息类型,redis将消息类型称为通道(channel).当发布者通过publish命令

redis学习3--redis功能 发布订阅,HyperLogLog,GEO,Lua等等

1 HyperLogLog HyperLogLog是一种字符串类型的数据结构,一种利用极小的内存完成大量独立用户数据统计,但是存在误差(官方0数字.81%). 2 发布与订阅 redis 不能做消息队列堆积,就是说最新的订阅者无法收到订阅前的消息 消息队列与发布订阅,消息队列是多个客户端抢消息,发布订阅是每个客户端都可以收到消息,这是他们的区别. 3 GEO GEO 支持存储位置信息,来实现附件的人,摇一摇等功能. 原文地址:https://www.cnblogs.com/tjqBlog/p/9

Redis学习笔记(8)-发布/订阅

package cn.com; import java.util.List; import redis.clients.jedis.Jedis; public class Redis_PubSub { public static Jedis redis = new Jedis("localhost", 6379);// 连接redis /** * PUBLISH channel message * 将信息 message 发送到指定的频道 channel . * */ public s

Redis - 事物控制和发布订阅

multi命令后续命令将进入队列,不会马上执行,当执行exec后,一次输出所有结果 事物回滚使用discard命令,放弃之前的输入执行. SUBSCRIBE/PUBLISH SUBSCRIBE KEYWORD PUBLISH KEYWORD MESSAGE 主可以publish到从,从无法publish给主,从可以publish给从

C# Redis系列(三)-Redis发布订阅及客户端编程

发布订阅模型 Redis中的发布订阅 客户端编程示例 0.3版本Hredis 发布订阅模型 在应用级其作用是为了减少依赖关系,通常也叫观察者模式.主要是把耦合点单独抽离出来作为第三方,隔离易变化的发送方和接收方. 发送方:只负责向第三方发送消息.(杂志社把读者杂志交给邮局) 接收方:被动接收消息.(1:向邮局订阅读者杂志,2:门口去接邮过来的杂志) 第三方作用是:存储订阅杂志的接收方,并在杂志过来时送给接收方. (邮局) C#示例,发送方把杂志放到邮局里面: if (QA.AddBug()) E