Redis基础知识 之——发布/订阅
一、说明:
订阅,取消订阅和发布实现了发布/订阅消息范式(引自wikipedia),发送者(发布者)不是计划发送消息给特定的接收者(订阅者)。而是发布的消息分到不同的频道,不需要知道什么样的订阅者订阅。订阅者对一个或多个频道感兴趣,只需接收感兴趣的消息,不需要知道什么样的发布者发布的。这种发布者和订阅者的解耦合可以带来更大的扩展性和更加动态的网络拓扑。
二、发布及订阅功能:
- 基于事件的系统中,Pub/Sub是目前广泛使用的通信模型,它采用事件作为基本的通信机制,提供大规模系统所要求的松散耦合的交互模式:订阅者(如客户端)以事件订阅的方式表达出它有兴趣接收的一个事件或一类事件;发布者(如服务器)可将订阅者感兴趣的事件随时通知相关订阅者。
- 消息发布者,即publish客户端,无需独占链接,你可以在publish消息的同时,使用同一个redis-client链接进行其他操作(例如:INCR等)
- 消息订阅者,即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,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.*
Redis基础知识 之——发布/订阅的更多相关文章
- redis基础知识详解
一.redis基础知识 1.Redis是什么Redis是一个开源的key-value存储系统. 和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表 ...
- 【进阶之路】Redis基础知识两篇就满足(一)
导言 大家好,我是南橘,一名练习时常两年半的java练习生,这是我在博客园的第一篇文章,当然,都是要从别处搬运过来的,不过以后新的文章也会在博客园同步发布,希望大家能多多支持^_^ 这篇文章的出现,首 ...
- 【进阶之路】Redis基础知识两篇就满足(二)
导言 大家好,我是南橘,一名练习时常两年半的java练习生,这是我在博客园的第二篇文章,当然,都是要从别处搬运过来的,不过以后新的文章也会在博客园同步发布,希望大家能多多支持^_^ 这篇文章的出现,首 ...
- 第三百零一节,python操作redis缓存-管道、发布订阅
python操作redis缓存-管道.发布订阅 一.管道 redis-py默认在执行每次请求都会创建(连接池申请连接)和断开(归还连接池)一次连接操作,如果想要在一次请求中指定多个命令,则可以使用pi ...
- Redis 02: redis基础知识 + 5种数据结构 + 基础操作命令
Redis基础知识 1).测试redis服务的性能: redis-benchmark 2).查看redis服务是否正常运行: ping 如果正常---pong 3).查看redis服务器的统计信息: ...
- Redis基础知识补充及持久化、备份介绍(二)--技术流ken
Redis知识补充 在上一篇博客<Redis基础认识及常用命令使用(一)--技术流ken>中已经介绍了redis的一些基础知识,以及常用命令的使用,本篇博客将补充一些基础知识以及redis ...
- Redis基础知识补充及持久化、备份介绍
Redis知识补充 在上一篇博客<Redis基础认识及常用命令使用(一)–技术流ken>中已经介绍了redis的一些基础知识,以及常用命令的使用,本篇博客将补充一些基础知识以及redis持 ...
- redis实现消息队列&发布/订阅模式使用
在项目中用到了redis作为缓存,再学习了ActiveMq之后想着用redis实现简单的消息队列,下面做记录. Redis的列表类型键可以用来实现队列,并且支持阻塞式读取,可以很容易的实现一个高性 ...
- 最全Redis基础知识
NoSQL概述 什么是NoSQL NoSQL不仅仅是SQL,它是Not Only SQL 的缩写,也是众多非关系型数据库的统称NoSQL和关系型数据库一样,也是用来存储数据的仓库. 为什么需要NoSQ ...
随机推荐
- [2017-7-25]Android Learning Day3
最近真的有点迷茫,感觉没有一个完整的教学体系很难进行下去,有的都是自己瞎捉摸,就跟以前ACM的时候一样,动不动就“这就是一道,水题暴力就行了”.“我们枚举一下所有的状态,找一下规律就行了”,mmp哟. ...
- failover swarm 故障转移
#故障转移 Failover #当其中一个节点关闭宕机时,其节点中的service会转移到另一个节点上.Swarm会检测到node1发生故障并把此故障节点的状态标记为Down; docker node ...
- 不是说记住rm -rf的教训就够了
不是说记住rm -rf的教训就够了 李阿玲· 12 天前 2013年,我在同步CTAN镜像的时候,在/home下我的文件夹里面操作了下面的命令: rsync -av --delete rsync:// ...
- Ubuntu18.04搜狗输入法最新版本2.2.0.0108经常乱码的解决方案
图示 解决 旧版 可以安装旧版(我只在新版sogoupinyin_2.2.0.0108_amd64才遇到这个问题) 旧版安装指南:http://www.cnblogs.com/dunitian/p/6 ...
- 关于angular1与angular2的应用区别
angular1.0的这些繁杂的api,还有它的执行速度,运行效率,学习曲线,都被人吐槽,最近一直在用ng1,实在很想吐槽. 最近写ng2的项目,写了一些ng2基础的应用(包括angular-cli, ...
- css之文本两端对齐
在进行网页设计时,我们经常会看到这样的样式:文本两端对齐. css为我们提供了一个属性可以实现这样的效果:text-align: justify.不过这个只能用来设置多行文本(除最后一行).如果只有单 ...
- Good Bye 2018 A. New Year and the Christmas Ornament
传送门 https://www.cnblogs.com/violet-acmer/p/10201535.html 题解: 这题没什么好说的,读懂题意就会了. 比赛代码: #include<ios ...
- layer.open窗口自适应问题
宽高度 area : ['100%', '100%']同时取消layer.full(index)就能自适应
- c#线程1
开启一个线程的方式: 方式一:Thread t1 = new Thread(Method_1); t1.Start();方式二:委托 Action ac = Method_1; ac.BeginInv ...
- java linux sdk1.8
wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-co ...