受甲流影响,这几天瘫卧在床,没有及时更新...希望大家在学习之余,一定也要注意身体,这鬼甲流太厉害了!!
接着上文:向爬虫而生---Redis 拓宽篇1 < pipeline传输效率>-CSDN博客
为什么非要讲一下这个发布订阅问题呢?因为Redis的发布订阅模块与Scrapy爬虫可以结合使用,以实现分布式爬取和数据处理。
Redis发布订阅(Pub/Sub)是一种广播消息的机制,允许多个订阅者接收同一频道上的消息。
发布者使用PUBLISH
命令将消息发送到指定频道。语法如下:
PUBLISH channel message
其中,channel
是频道的名称,message
是要发布的消息内容。该命令会返回成功发送到的订阅者数量。
示例: 假设我们有一个频道名为news
,发布者使用以下命令向该频道发布一条消息:
PUBLISH news "Breaking news: Redis 6.0 released!"
这条消息将被发送到订阅了news
频道的所有订阅者。
订阅者使用SUBSCRIBE
命令订阅一个或多个频道,以接收该频道上的消息。
SUBSCRIBE channel [channel ...]
其中,channel
是频道的名称。每个订阅者都会创建一个独立的连接来接收消息,并将其阻塞。
示例: 我们创建一个订阅者,并订阅名为news
的频道:
SUBSCRIBE news
现在,每当有新消息发布到news
频道,该订阅者就会接收到并显示出来。
UNSUBSCRIBE
命令用于取消对指定频道的订阅。
UNSUBSCRIBE [channel [channel ...]]
可以一次性取消订阅一个或多个频道。
示例: 假设订阅者已经订阅了news
频道,现在想要取消对该频道的订阅,在订阅者连接上使用如下命令:
UNSUBSCRIBE news
这样订阅者将不再接收到news
频道上的消息。
Redis还支持订阅模式,订阅者可以通过PSUBSCRIBE
命令订阅符合指定模式的频道。
PSUBSCRIBE pattern [pattern ...]
其中,pattern
是一个模式字符串,可以使用通配符来匹配多个频道。
示例: 假设我们有两个频道,分别是news.sports
和news.politics
,一个订阅者希望订阅所有以news.
开头的频道,可以使用如下命令:
PSUBSCRIBE news.*
这样,订阅者将接收到满足该模式的所有频道上发布的消息。
PUNSUBSCRIBE
命令用于退订指定模式的频道。
PUNSUBSCRIBE [pattern [pattern ...]]
可以一次性退订一个或多个模式。
示例: 假设订阅者已经通过PSUBSCRIBE news.*
订阅了所有news.
开头的频道,现在想要退订这个模式,可以使用如下命令:
PUNSUBSCRIBE news.*
通过PUBSUB CHANNELS
命令,可以列出当前至少有一个订阅者的频道。
PUBSUB CHANNELS
示例: 如果我们有两个频道,分别是news
和weather
,并且有两个订阅者分别订阅了这两个频道,那么使用如下命令:
PUBSUB CHANNELS
将返回:
1) "news"
2) "weather"
通过PUBSUB NUMSUB
命令,可以列出给定频道的订阅者数量。可以一次性给出多个频道,返回每个频道及其对应的订阅者数量。
PUBSUB NUMSUB channel [channel ...]
示例: 假设有三个频道:news
、weather
和sports
,分别有两个、三个和一个订阅者。我们可以使用以下命令:
PUBSUB NUMSUB news weather sports
将返回:
1) "news"
2) "2"
3) "weather"
4) "3"
5) "sports"
6) "1"
使用PUBSUB NUMPAT
命令,可以列出当前被订阅模式的数量。
PUBSUB NUMPAT
示例: 在上述的订阅模式示例中,假设当前有两个被订阅的模式,我们可以使用如下命令:
PUBSUB NUMPAT
将返回:
1) "2"
除了使用SUBSCRIBE
命令以外,Redis还提供了一种以订阅者模式来接收消息的方式。通过将订阅者连接标记为SUBSCRIBE
,它将接收到的消息转发给其他客户端,作为它们的订阅者。这种方式可以用于构建分布式系统或代理模式。
示例: 我们创建一个订阅者模式的订阅者,在一个SUBSCRIBE
连接上使用如下命令:
SUBSCRIBE
假设我们有一个新闻发布系统,其中一个组件是一个代理订阅者,它会将接收到的新闻消息转发给其他应用程序或服务。我们将使用Redis的订阅者模式来实现这个代理订阅者。
SUBSCRIBE
,如下所示:SUBSCRIBE
这个连接会一直阻塞并等待接收消息。
news.sports
频道:SUBSCRIBE news.sports
news.politics
频道:SUBSCRIBE news.politics
PUBLISH
命令将消息发布到news.sports
和news.politics
频道,如下所示:PUBLISH news.sports "Breaking news: Redis Pub/Sub is awesome!"
PUBLISH news.politics "Breaking news: Redis Pub/Sub is popular!"
如果要退订订阅者已经订阅的所有频道和模式,可以使用UNSUBSCRIBE
命令,不带任何参数即可。
示例: 假设订阅者当前订阅了两个频道,news
和weather
,以及一个模式news.*
。要一次性退订所有频道和模式,可以在订阅者连接上使用如下命令:
UNSUBSCRIBE
Redis Pub/Sub还支持以阻塞模式订阅单个频道。使用SUBSCRIBE
命令后,订阅者连接会一直阻塞,直到有消息发布到指定频道。
示例: 假设我们有一个频道messages
,我们可以创建一个阻塞订阅者连接,并订阅该频道,如下所示:
SUBSCRIBE messages
这将阻塞订阅者连接,直到有消息在messages
频道上发布。