Redis中的“发布”和“订阅”详细讲解说明(图文并茂)
Redis中的“发布”和“订阅”详细讲解说明(图文并茂)
Redis中的“发布”和“订阅”详细讲解说明(图文并茂)
1. 发布和订阅的概念
发布和订阅是什么?
一句话:Redis发布(pub)订阅(sub)是一种消息通信模式:发送者(pub)发送信息,订阅者(sub)接收信息。
- 订阅:subscribe
- 发布:publish
Redis客户端可以订阅任意数量的频道。
客户端订阅频道示意图:
当给这个频道发布消息后,消息就会发送给订阅了的客户端:
发布了一个消息Hello,给了对应的频道,然后这些订阅了该频道的客户端,就会读取到发布的(Hello)的消息。
客户端可以订阅多个频道。
可以发布多个消息给多个频道。
如何理解发布和订阅模式:
任务队列:
- 顾名思义,就是“传递消息的队列”
- 与任务队列进行交互的实体有两类:
- 一类是:生产者(producer),
- 另一类则是消费者(consumer)
生产者将需要处理的任务放入到任务队列当中,而消费者则不断地从任务队列中读取任务信息并执行。
如何简单理解:
- Subscriber:看作是收音机。可以收到多个频道,并以队列方式显示。
- Publisher:看做是电台。可以往不同的FM频道中发送消息。
- Channel:不同频率的FM频道
从Pub/Sub的机制来看,它更像是一个广播系统,多个订阅者(Subscriber)可以订阅多个频道(Channel),多个发布者(Publisher)可以往多个频道(Channel)中发布消息。
简单通俗一点就是说:发布消息到一个中间件上,而订阅/配置了这个中间件的客户端,就会实时/接收到这个发送到中间件上的消息。
2. 发布订阅模式分类
2.1 一个发布者,多个订阅者
一个发布者,多个订阅者
主要应用:通知、公告。
可以作为消息队列或者消息管道。
2.2 多个发布者,一个订阅者
多个发布者,一个订阅者
各应用程序作为Publisher向Channel中发送消息,Subscriber端收到消息后执行相应的业务逻辑,比如写数据库,显示。
主要应用:排行榜,投票,计数。
2.3 多个发布者,多个订阅者
多个发布者,多个订阅者。
可以向不同的Channel中发送消息,由不同的Subscriber接收
主要应用:群聊,聊天
3. Redis命令行实现发布和订阅
关于Redis实现发布和订阅有如下6个相关的命令:
- PUBLISH channel msg
将消息message发送到指定的频道channel - SUBSCRIBE channel [channel ...]
订阅频道,可以同时订阅多个频道 - UNSUBSCRIBE [channel ...]
取消订阅指定的频道,如果不指定频道,则会取消所订阅的所有频道 - PSUBSCRIBE pattern [pattern ...]
订阅一个或多个符合给定模式的频道,每个模式以作为匹配符,比如it匹配所有以it开头的频道(it.news,it.blog,it.tweets等等);
news.*匹配所有以news.开头的频道(new.it,new.global.today等等),诸如此类。 - PUNSUBSCRIBE [pattern [pattern ...]]
退订指定的规则,如果没有参数则会退订掉所有规则。 - PUBSUB
[argument [argument …]]
是一个查看订阅与发布系统状态的内省命令,
代码示例:
# client-1 订阅 news.it 和 news.sport 两个频道
client-1> SUBSCRIBE news.it news.sport
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "news.it"
3) (integer) 1
1) "subscribe"
2) "news.sport"
3) (integer) 2
# client-2 订阅 news.it 和 news.internet 两个频道
client-2> SUBSCRIBE news.it news.internet
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "news.it"
3) (integer) 1
1) "subscribe"
2) "news.internet"
3) (integer) 2
# 首先, client-3 打印所有活跃频道
# 注意,即使一个频道有多个订阅者,它也只输出一次,比如 news.it
client-3> PUBSUB CHANNELS
1) "news.sport"
2) "news.internet"
3) "news.it"
# 接下来, client-3 打印那些与模式 news.i* 相匹配的活跃频道
# 因为 news.sport 不匹配 news.i* ,所以它没有被打印
redis> PUBSUB CHANNELS news.i*
1) "news.internet"
2) "news.it"
4. Redis命令行实现发布和订阅
4.1 一个发布者,多个订阅者演示
让client01,client02两个客户端都订阅上channel1频道。
127.0.0.1:6379> subscribe channel1 # 让客户端订阅 channel1频道

当订阅上了一个频道,就会实时监听该频道的存在的内容。所以我们想要退出的话,可以Ctrl + C或者quit
让client02也订阅上channel频道,进行接收消息。
127.0.0.1:6379> subscribe channel1
两个Client客户端都订阅上了channel1频道了。
接下来,让publish客户端向channel1频道发送信息。看看,client01,client02两个订阅了channel1的客户端是否会监听到发送的信息。
127.0.0.1:6379> publish channel1 "hello,jack"
4.2 多个发布者,一个订阅者演示
这里我们演示:让client01客户端通过订阅channel1频道,实时监听/接收:publish01和publish02向channel发送的信息。
127.0.0.1:6379> subscribe channel1
127.0.0.1:6379> publish channel1 "hello tom"
127.0.0.1:6379> publish channel1 "hello lihua"
4.3 多个发布者,多个订阅者演示
让publish01,publish01两个客户端都向channel1频道发送消息,client01和client02都订阅channel1频道,接收/监听该(channel1)频道的信息。
127.0.0.1:6379> subscribe channel1
127.0.0.1:6379> subscribe channel1
# 返回的是订阅者的数量
127.0.0.1:6379> publish channel1 "hello AAA"
127.0.0.1:6379> publish channel1 "BBB"
5. 注意事项:
- publish同一时刻只能向一个channel频道发送信息,不可以多个。
- subscribe命令可以同一时刻订阅多个channel频道。返回的是订阅者的数量。
- 发布的消息没有持久化,所以订阅的客户端,只能收到订阅后发布的消息。无法接收该客户端还没订阅上时已经发布的消息(错过的消息)。
6. 最后:
“在这个最后的篇章中,我要表达我对每一位读者的感激之情。你们的关注和回复是我创作的动力源泉,我从你们身上吸取了无尽的灵感与勇气。我会将你们的鼓励留在心底,继续在其他的领域奋斗。感谢你们,我们总会在某个时刻再次相遇。”