发布订阅模式可以说是耳熟能详了,它是属于设计模式中的行为模式,最大的好处就是起到解耦的作用,发布者不用关心在消息产生之后需要做什么,发布者只需要在通道里说“我发布了”,不用管有什么业务逻辑需要处理也不用管有多少的逻辑要处理,很简单明了。
我们平时用来解耦业务的消息队列就是实现了发布订阅模式,所以Redis可以在一些情况下做为消息队列来使用。
还是贴一张图把(网上盗的),解释下这种模式。
接下来看看在Redis中怎么实现
PSUBSCRIBE pattern1 pattern2 //订阅一个或者多个符合给定模式的通道 ? ?* 和 * ?标识一个占位符,*标识多个占位符包括0个 ?*标识一个以上的占位符
PUBLISH channel1 message1 //发布消息到指定的通道
PUNSUBSCRIBE pattern1 pattern2 //退订一个或者多个符合给定模式的通道,不传pattern 代表退订所有
SUBSCRIBE channel1 channel2 //订阅一个或者多个通道
UNSUBSCRIBE channel1 channel2 //退订一个或者多个通道 不传channel 代表退订所有
命令不复杂,我们来操作一下吧 首先发送一个命令到a_1的通道中,因为现在没有订阅者所以返回了0
我们新开一个客户端订阅这个通道,可以看到成功订阅了,返回了当前客户端订阅的通道数量,但是没有收到在订阅之前已经发送的消息,所以Redis的发布订阅的消息是没有持久化的,这是如果实现消息队列需要解决的问题
在第一个客户端发送几条消息
能看到第二个客户端接收到了消息
不同客户端执行相同命令产生不同的结果?
首先我用Another RDM的Console来进行订阅,命令会返回当前客户端订阅的通道数量,多次订阅不会重复订阅
接着在客户端1中发送消息,命令会返回订阅的客户端数量
接着在客户端2中进行模式订阅,可以看到订阅的通道数量变成2了,在客户端1发送消息,数量也变成2,所以我觉得发送信息的命令应该返回的是发送消息的数量
看到这里就已经证明我上面的说的话,但是因为Another没法监听的消息,我用redis-cli测试了一遍,然后就发现同样的命令既然产生不同的效果了。如下图,能看到当我psubscribe的时候没有输出东西,当我在客户端1发送消息的时候也只收到一条,而且客户端1显示消息数量也是3。而不是预想中的4。具体原因我也想不出来了。。希望大神解答。
后来在官网看到了说法
Messages matching both a pattern and a channel subscription
A client may receive a single message multiple times if it‘s subscribed to multiple patterns matching a published message, or if it is subscribed to both patterns and channels matching the message. Like in the following example:
SUBSCRIBE foo PSUBSCRIBE f*
In the above example, if a message is sent to channel
foo
, the client will receive two messages: one of typemessage
and one of typepmessage
.
也就是印证了我最开始的想法。
原文:https://www.cnblogs.com/rstar/p/12844148.html