一、说明:

订阅,取消订阅和发布实现了发布/订阅消息范式(引自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

Redis基础知识 之——发布/订阅相关推荐

  1. 技术实践|Redis基础知识及集群搭建(上)

    Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.本篇文章围绕Redis基础知识及集群搭建相关内容进行了分享,希 ...

  2. Redis基础知识入门

    Redis快速入门 博主关于Redis高级特性的一些讲解,传送地址如下: 删除策略与淘汰策略详解 主从复制详解 哨兵模式详解 集群详解 缓存预热 & 缓存雪崩 & 缓存击穿 & ...

  3. Redis——Redis删除策略和发布订阅

    Redis删除策略和发布订阅 过期数据 Redis中的数据特征 时效性数据的存储结构 数据删除策略 定时删除 惰性删除 定期删除 删除策略对比 逐出算法 新数据进入检测 影响数据逐出的相关配置 Red ...

  4. Redis学习 - NoSQL简介、redis安装、redis基础知识、数据类型、持久化、订阅发布、主从复制、哨兵模式、缓存击穿和雪崩

    学习视频地址:https://www.bilibili.com/video/BV1S54y1R7SB 完结撒花,感谢狂神 文章目录 1. NoSQL 1.1 单机Mysql的演进 1.2 当今企业架构 ...

  5. Redis基础知识总结概述

    redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set ...

  6. Redis基础知识+安装+常用命令使用

    Redis NoSql概述 为什么用NoSql 单机MySQL的时代! 上古90年代,更多的是静态网页,动态交互类型的网站不多.一个基本网站访问量一般不会太大,单个数据库可以轻松应付. 现如今的大数据 ...

  7. Redis 进阶篇:发布订阅模式原理与运用

    Redis 通过 SUBSCRIBE,UNSUBSCRIBE和 PUBLISH 实现发布订阅消息传递模式,Redis 提供了两种模式实现,分别是「发布 / 订阅到频道」和「发布 \ 订阅到模式」. [ ...

  8. 万字文肝Redis基础知识

    目录 第一章 Redis 的介绍和安装 1.1 为什么需要学习 NOSQL 1.2 主流的 NOSQL 产品 1.3 NOSQL 的特点 1.4 Redis 概述 1.5 Window 版 Redis ...

  9. java春招面试冲刺系列:redis基础知识详细解析

    目录 学习计划 学习笔记 百问 redis在什么情况下会变慢? 单线程的redis,如何知道要运行定时任务? 学习计划 Redis的介绍.优缺点.使用场景 Linux中的安装 常用命令 Redis各个 ...

  10. redis系列-redis基础知识总结

    一.Redis 设计架构 1.1.Redis整体架构和redis学习思路 上图是我理解的redis单机工作的一个概图. 我尝试从以下基本内容来学习redis: 单机redis 就单机版而言,我们可以从 ...

最新文章

  1. 查询liunx上磁盘占用情况
  2. JDBC编程的事务处理
  3. CEDD(Color and Edge Directivity Descriptor)算法
  4. 2017年2月20日 Random Forest Classifier
  5. 什么是 SAP Commerce Cloud 的 catalog
  6. android自定义控件实例
  7. wyse WES系统操作
  8. androidstuio实现页面跳转_vue-router 基础:4类路由跳转示例
  9. mysql 性能优化 20 条建议
  10. java中注释如何换行,java注释中空格和换行符的处理
  11. matlab批量写入文件,matlab批量合并txt文件
  12. 博士申请 | 皇家墨尔本理工大学鲍芝峰教授招收数据挖掘方向全奖博士生
  13. python车牌识别_Python+Tensorflow+CNN实现车牌识别的示例代码
  14. 如何创新地解决光缆运维痛点?
  15. 老虎机数字抽奖(可控制结果)
  16. 桌面只计算机图标发白,win7系统桌面图标变白怎么回事_电脑桌面图标有小白块...
  17. 云小朵软件内测分发测试平台说明文档
  18. pfa100_PFA的主要性能
  19. 在APP里调用第三方文件管理器进行管理文件
  20. 当食品安全遇上“区块链”

热门文章

  1. 开发错误记录5-Failed to sync Gradle project ‘HideTitleDemo’
  2. 《BI那点儿事》数据流转换——百分比抽样、行抽样
  3. Windows Phone开发(14):数据模板 转:http://blog.csdn.net/tcjiaan/article/details/7350849...
  4. 面试题之谈一谈你所知道的C++的框架
  5. 难道现在是保险业的高速发展期?
  6. mysql随机字符串函数
  7. python函数知识七 闭包、装饰器一(入门)、装饰器二(进阶)
  8. Win10 第三方浏览器无法上网或者上网速度慢 的终极解决方案
  9. Java内存溢出定位和解决方案(new)
  10. 2017-2018 ACM-ICPC, NEERC A题Automatic Door 挺棘手的模拟