redispublish(redis publish消息时效)
本篇文章给大家谈谈redispublish,以及redis publish消息时效对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、Redis实现不可靠发布/订阅功能
- 2、Redis发布订阅和Stream
- 3、用phpredis操作redis集群支持publish和subscribe吗
- 4、php怎么使用 redis pub/sub
- 5、redis publish 消息最大长度是多少
- 6、最通俗易懂的Redis发布订阅及代码实战
Redis实现不可靠发布/订阅功能
Redis 通过 PUBLISH 、 SUBSCRIBE 等命令实现了订阅与发布模式, 这个功能提供两种信息机制, 分别是订阅/发布到频道和订阅/发布到模式, 本文讨论订阅/发布到频道的实现
如图展示了发布消息到 channel1 后,各个client都会接收到 message
虽然Redis能够实现发布/订阅的功能,但是有如下缺点,所以选用前需谨慎考虑
由于Redis发布/订阅模型存在的缺陷,所以使用前需要考虑如下几点
具体使用还是需要考虑业务场景需求
在目前SpringBoot使用Redis的操作中,官方推荐使用SpringData模块中的 spring-data-redis ,所以下文会以 spring-data-redis 进行
序列化使用的是 GenericJackson2JsonRedisSerializer ,使用这个类可以正确序列化Null的对象.如果使用 Jackson2JsonRedisSerializer ,会将对象序列号成空数组.
简单起见,在这里使用SpringSchedule,周期性发布消息
在订阅程序中,有两个比较重要的类,分别是 MessageListenerAdapter 和 RedisMessageListenerContainer
其中 MessageListenerAdapter 实现 MessageListener 作用是将自定义的消费类进行适配.这个类必须汪春有一个 public 的消费方法,并且方法需要有两个参数,arg1为 channel ,arg2是 Message .原因可以在 MessageListenerAdapter 源码中发现
在 MessageListenerAdapter.onMessage 方法中,通过反射对消费类进行了方法调用,并且方法的参数和顺序进行了硬编码,所以必须在消费类中提供一个public方法
从官方文档中,可以敏庆得知 RedisMessageListenerContainer 的作用是用于接收消息后进行分发,并且通过内部的线程池进行异步分发,(也可以使用自定义桥陵握的线程池和相关失败策略)
启动一个发布者,两个订阅者
Redis发布订阅和Stream
发布订单系统是日常开发中经常会用到的功能。简单来说,就是发布者发布消息,订阅者就会接受到消息并进行相应的处理,如下图所示。
Redis为我们提供了发布/订阅的功能模块PubSub,可以用于消息传递。
其中发布者publisher、订阅者subscriber都是redis客户端,channel则是redis服务器。
发布者publisher向channel发送消息,订阅该channel的subscriber就会接收到消息。
发布消息publish
订阅test1、test2的客户端会收到消息
按照上述这种方式,如果 订阅者subscriber想要订阅多个channel 则需要同时指定多个channel的名称,redis为了解决这个问题提供 psubscribe模式匹配 这种订阅方式,可以通过通卜凳配符的方式匹配频道。
发布消息
之前订阅ch*的客户端就会收到cha频道和china频道的消息,这样就一次性订阅多个频道
redis服务端存储了订阅频道/模式的客户端列表
相当于如果客户端订阅一个频道 ,那么服务端的 pubsub_channels 就会存储一条数据, pubsub_channels 其实是一个链表,key对应channel,value对应客户端列表,根据key订阅的频道型帆旅,就可以找到订阅该频道的所有客户端。
同时如果客户端订阅一个模式 , pubsub_patterns 也会新增一条数据,记录当前客户端订阅的模式, pubsub_patterns 也有自己的数据结构,其中就包含了客户端以及模式。
当发布者向某个频道发布消息时,就会遍历 pubsub_channels 找到订阅该频道的客户端列表,依次向这些客户端发送消息。
然后遍历 pubsub_patterns 找到符合当前频道的模式,同时找到模式对应的客户端,然后向客户端发送消息。
虽然Redis提供了发布/订阅的功能,但是并不完善,导致基本没有合适的场景能够使用。
PubSub缺点:
直到Redis5.0出现之后,出现了Stream这种数据结构,才终于完善了Redis的消息机制 。
Stream实际上就是一个消息列表,只是他几乎实现了消息队列所需要的所有功能,包括:
同时需要注意的是Stream只是一个数据结构,他不会主动把消息推送给消费者,需要消费者主动来消费数据 。
每个Stream都有唯一的名称,它就是Redis的key,首次使用 xadd 指令追加消息时自动创建。
常见操作命令如下表:
如果客户端希望知道自身消费到第几条数据了,那么就需要记录一下当前消费的消息ID,下次再次消费的时候就从上次消费的消息ID开始读取数据即可。
消费组中多了一个游标 last_delivered_id ,表示当前消费到了哪一条数据。同时所有的数据都是待处理消息( PEL ),只有消费者处理完毕之后使用 ack 指令告知redis服务器,数据才会从 PEL 中移除,确认后的消息就无法再次消费。
如果接收到的消息比较多,为了避免Stream过长,可以选择指定Stream的最大长度,一旦到达了最大长度,就会从最早的消息开轿氏始清除,保证Stream中最新的消息。
[img]用phpredis操作redis集群支持publish和subscribe吗
用phpredis操作redis集群支持publish和subscribe
参数可选Redis::MULTI或Redis::PIPELINE. 默认是 Redis::MULTI
Redis::MULTI:将多个操作当成一个事务执行
Redis::PIPELINE:让(多条)执行命令简单的,更加快速的发送给服务器,但是没有任何原子性的保证
discard:删除一个事务
返回值
multi(),返回一个redis对象,并进入multi-mode模式,一旦进入multi-mode模式,
以后调用的所有方法都会返回相同的对象,只到exec()方法被调用。
watch, unwatch (代码测试后,不能达到所说锋散段的效果)
监测一个key的值是否被其它的程序更改。银誉如果这个掘伍key在watch 和 exec (方法)间被修改,
这个 MULTI/EXEC 事务的执行将失败(return false)
unwatch 取消被这个程序监测的所有key
php怎么使用 redis pub/sub
一.场景介绍
最近的一个项目需要用到发布/订阅的信息系统,以做到最新实时消息的通知。经查找后发现了redis pub/sub(发布/订阅的信息系统)可以满足我的开发需求,而且学习成本和使用成本也比较低。 :grin:
二.什么是redis pub/sub
资料查看
大家在看我的blog的同时可以打开redis官方对于redis pub/sub的介绍,感觉看英文文档吃力的话 :cry: ,可以看redis中文网的翻译介绍.
Pub/Sub功能(means Publish, Subscribe)即发布及订阅功能
1 基于事件的系统中,Pub/Sub是目前广泛使用的通信模型,它采用事件作为基本的通信机制,提供大规模系统所要求的松散耦合的交互模式:订阅者(如客户端)以事件订阅的方式表达出它有兴趣接收的一个事件或一类事件;发布者(如服务器)可将订阅者感兴趣的事件随时通知相关订阅者。
2 消息发布者,即publish客户端,无需独占链接,你可以在publish消息的同时,使用同一个redis-client链接进行其他操作(例如:INCR等)
3 消息订阅者,即subscribe客户端,需要独占链接,即进行subscribe期间,redis-client无法穿插其他操作,此时client以阻塞的方式等待“publish端”的消息;这一点很好理解,因此subscribe端需要使用单独的链接,甚至需要在额外的线程中使用。
三.redis pub/sub的使用
下面我将配着实图(用我的本地机器环境)来为大家讲解redis的pub/sub怎么去使用 .
没有安装phpredis扩展的或者没有redis服务的,请参考我的另一篇blog,有详细的安装介绍,这里不再赘述了。
1、启动redis服务端:
[caption id="attachment_1777" align="alignnone" width="300"] php redis pub/sub(消息订阅系统)经验总结之一[/caption]
2、新开一个终端,启动redis客户端,并做为subscribe客户端(消息订阅者),订阅一个名字叫test的频道的频道信息:
3、启动redis客户端,并做为publish客户端(消息发布者),发布一个名字叫test的频道,信息是:hello,world
4、再切换到2步骤中的redis客户端窗口,会发现,已经订阅到了刚才发布的 'hello,world'消息:
5、模式匹配订阅
Redis 的Pub/Sub实现支持模式匹配。客户端可以订阅全风格的模式以便接收所有来自能匹配到给定模式的频道的消息。
比如,将接收所有发到 test.name,test.phone,test.address...等等的消息,该这样写:
[shell]PUBSCRIBE test.*[/shell]
在终端回车后,同时再新的窗口里分别发布两个频道的消息,名字分别为:test.name和test.phone,然后切换到订阅端的窗口里,结果如下图所示:
由上图可以看出,在订阅了test.*频道后肢指宏,一共收到了 test.name和test.phone两个频道的消息,这就是模式匹配订阅。
那么取消订阅匹配该模式的客户端也比较简单:
[shell]PUNSUBSCRIBE test.*[/shell]
6、好,以上的这些简单的demo,就是关于redis pub/sub(Publish/Subscribe,发布/订阅的信息系统)的最基本逗裤使用。说了这么多,跟php也没有挂上什么钩,别着急,重要的都往往最后出场。 :lol:
四.php使用redis的pub/sub(发布/订阅的信息系统)
这里我列出一些常用的命令:
phpredis的安装
redis的客户端连接支持多种语言。这里我用的是php的phpredis,它是用c语言编写的,目前已经作为历册php的一个模块扩展,没有安装的可以参考我的另一篇blog,已经安装的可以忽略此步骤.
命令手册
这里我列出一些常用的:
[shell]Redis::__construct构造函数
$redis = new Redis();
connect, open 链接redis服务
参数
host: string,服务地址
port: int,端口号
timeout: float,链接时长 (可选, 默认为 0 ,不限链接时间)
注: 在redis.conf中也有时间,默认为300
pconnect, popen 不会主动关闭的链接
参考上面
setOption 设置redis模式
getOption 查看redis设置的模式
ping 查看连接状态
get 得到某个key的值(string值)
如果该key不存在,return false
set 写入key 和 value(string值)
如果写入成功,return ture
setex 带生存时间的写入值
$redis-setex('key', 3600, 'value'); // sets key → value, with 1h TTL.
setnx 判断是否重复的,写入值br /$redis-setnx('key', 'value');
$redis-setnx('key', 'value');
delete 删除指定key的值
返回已经删除key的个数(长整数)
$redis-delete('key1', 'key2');
$redis-delete(array('key3', 'key4', 'key5'));
span style="font-size: 16px; line-height: 24px;"
[/shell]
更详细的使用请参考这里,我就不写太多,因为我要直接摞代码了. :lol:
publish(消息发布端):pub.php
[php]
/**
* redis sub(消息订阅端)
* @ blog: phping.sinaapp.com
* @date 2016-04-24 15:00
*/
$redis = new Redis();
// 第一个参数为redis服务器的ip,第二个为端口
$res = $redis-connect('127.0.0.1', 6379);
// test为发布的频道名称,hello,world为发布的消息
$res = $redis-publish('test','hello,world');
[/php]
subscribe(消息订阅端): sub.php
[php]
/**
* redis sub(消息订阅端)
* @ blog: phping.sinaapp.com
* @date 2016-04-24 15:00
*/
$redis = new Redis();
$res = $redis-pconnect('127.0.0.1', 6379,0);
$redis-subscribe(array('test'), 'callback');
// 回调函数,这里写处理逻辑
function callback($instance, $channelName, $message) {
echo $channelName, "==", $message,PHP_EOL;
}
[/php]
开始订阅redis消息
前面已经提到过,消息订阅者,即subscribe客户端,需要独占链接,即进行subscribe期间,redis-client无法穿插其他操作,此时client以阻塞的方式等待“publish端”的消息,所以我们用命令行来执行:
则 订阅消息的redis客户端已经启动,随时等待发布过来的消息并订阅该消息.
发布redis消息
同样,命令行执行消息发布端的脚本即可:
[shell]
php pub.php
[/shell]
切换到消息订阅端的窗口发现终端有输出,如下图:
哈哈,是不是 收到了发布端发布的'hello,world'这条消息呢。
五.总结
在命令执行redis订阅端脚本时,发现在终端会输出:
[shell]
PHPFatalerror: Uncaughtexception'RedisException'withmessage'readerroronconnection'in…
[/shell]
这样的错误是什么原因呢?请看我下一篇blog,本篇主要是讲一些基本的语法,在下一篇我会着重讲解一些在实际开发中遇到过的哪些问题和跳过的哪些坑。。。 :mrgreen:
码字不易,望转载注明出处哈 ;)
redis publish 消息最大长度是多少
MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们。消 息传递指的是程序之间通过在运渣消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术。排穗悄腊队指的是应用猜滑程序通过 队列来通信。队列的使用除去了接收和发送应用程序同时执行的要求。其中较为成熟的MQ产品有IBM WEBSPHERE MQ。
最通俗易懂的Redis发布订阅及代码实战
除了使用List实现简单的消息队列功能以外,Redis还提供了发布订阅的消息机制。在这种机制下,消息发布者向指定频道(channel)发布消息,消息订阅者可以收到指定频道的消息,同一个频道可以有多个消息订阅者,如下图:
Redis也提供了一些命令支持这个机制,接下来我们详细介绍一下这些命令败樱。
在Redis中,发布订阅相关命令有:
发布消息的命令是 publish ,语法是:
比如,要向channel:one-more-study:demo频道发布一条消息“I am One More Study.”,命令如下:
返回的结果是订阅者的个数,上例中没有订阅者,所以返回结果为0。
订阅消息的命令是 subscribe ,订阅者可以订阅一个或者多个频道,语法是:
比如,订阅一个channel:one-more-study:demo频道,命令如下:
返回结果中有3条,分别表示:返回值的类型(订阅成功)、订阅的频道名称、目前已订阅的频道数量。当订阅者接受到消息时,就会显示:
同样也是3条结果,分别表示:返回值的类型(信息)、消息来源的频道名称、消息内容。
新开启的订阅者,是无法收到该频道之前的历史消息的,因为Redis没有对发布的消息做持久化。
取消订阅的命令是 unsubscribe ,可以取消一个或者多个频道的订阅,语法是:
比如,取消订阅channel:one-more-study:demo频道,命令如下:
返回结果中有3条,分别表示:返回值的类型(取消订阅成功)、取消订阅的频道名称、目前已订阅的频道数量。
按模式订阅消息的命令是 psubscribe ,订阅一个或多个符合给定模式的频道,语法是:
每个模式以 * 作为匹配符,比如 channel* 匹配所有以 channel 开头的频道,命令如下:
返回结果中有3条,分别表示:返回值的类型(按模式订阅成功)、订阅的模式、目前已订阅的模式数量。当订阅者接受到消息时,就会显示:
返回结果中有4条,分察枣丛别表示岩并:返回值的类型(信息)、消息匹配的模式、消息来源的频道名称、消息内容。
按模式取消订阅的命令是 punsubscribe ,可以取消一个或者多个模式的订阅,语法是:
每个模式以 * 作为匹配符,比如 channel:* 匹配所有以 channel 开头的频道,命令如下:
返回结果中有3条,分别表示:返回值的类型(按模式取消订阅成功)、取消订阅的模式、目前已订阅的模式数量。
活跃频道指的是至少有一个订阅者的频道,语法是:
比如:
比如:
光说不练假把式,我们使用Java语言写一个简单的发布订阅示例。
Jedis是Redis官方推荐的Java连接开发工具,我们使用Jedis写一个简单的集群示例。
运行结果如下:
关于redispublish和redis publish消息时效的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。