向爬虫而生---Redis 拓宽篇2 <Pub/Sub发布订阅>
前言:
受甲流影响,这几天瘫卧在床,没有及时更新...希望大家在学习之余,一定也要注意身体,这鬼甲流太厉害了!!
接着上文:向爬虫而生---Redis 拓宽篇1 < pipeline传输效率>-CSDN博客
为什么非要讲一下这个发布订阅问题呢?因为Redis的发布订阅模块与Scrapy爬虫可以结合使用,以实现分布式爬取和数据处理。
- 分布式消息队列:Scrapy可以使用Redis的发布订阅模块作为分布式消息队列,在多个爬虫节点之间共享URL或任务。发布者将待爬取的URL发布到指定频道,而订阅者在不同的节点上订阅该频道,接收URL并执行相应的爬取任务。
- 实时数据处理:使用Redis的发布订阅模块,Scrapy爬虫可以将爬取的数据实时发布到指定频道,而其他消费者可以订阅该频道以获取数据并进行实时处理。这可以用于构建实时监控、数据分析和实时可视化等功能。
正文:
Redis发布订阅(Pub/Sub)是一种广播消息的机制,允许多个订阅者接收同一频道上的消息。
1.发布者(Publish)
发布者使用PUBLISH
命令将消息发送到指定频道。语法如下:
PUBLISH channel message
其中,channel
是频道的名称,message
是要发布的消息内容。该命令会返回成功发送到的订阅者数量。
示例: 假设我们有一个频道名为news
,发布者使用以下命令向该频道发布一条消息:
PUBLISH news "Breaking news: Redis 6.0 released!"
这条消息将被发送到订阅了news
频道的所有订阅者。
2.订阅者(Subscribe)
订阅者使用SUBSCRIBE
命令订阅一个或多个频道,以接收该频道上的消息。
SUBSCRIBE channel [channel ...]
其中,channel
是频道的名称。每个订阅者都会创建一个独立的连接来接收消息,并将其阻塞。
示例: 我们创建一个订阅者,并订阅名为news
的频道:
SUBSCRIBE news
现在,每当有新消息发布到news
频道,该订阅者就会接收到并显示出来。
3.取消订阅(Unsubscribe)
UNSUBSCRIBE
命令用于取消对指定频道的订阅。
UNSUBSCRIBE [channel [channel ...]]
可以一次性取消订阅一个或多个频道。
示例: 假设订阅者已经订阅了news
频道,现在想要取消对该频道的订阅,在订阅者连接上使用如下命令:
UNSUBSCRIBE news
这样订阅者将不再接收到news
频道上的消息。
4.订阅模式(Pattern Subscribe)
Redis还支持订阅模式,订阅者可以通过PSUBSCRIBE
命令订阅符合指定模式的频道。
PSUBSCRIBE pattern [pattern ...]
其中,pattern
是一个模式字符串,可以使用通配符来匹配多个频道。
示例: 假设我们有两个频道,分别是news.sports
和news.politics
,一个订阅者希望订阅所有以news.
开头的频道,可以使用如下命令:
PSUBSCRIBE news.*
这样,订阅者将接收到满足该模式的所有频道上发布的消息。
5.退订指定模式(Pattern Unsubscribe)
PUNSUBSCRIBE
命令用于退订指定模式的频道。
PUNSUBSCRIBE [pattern [pattern ...]]
可以一次性退订一个或多个模式。
示例: 假设订阅者已经通过PSUBSCRIBE news.*
订阅了所有news.
开头的频道,现在想要退订这个模式,可以使用如下命令:
PUNSUBSCRIBE news.*
6.列出至少有一个订阅者的频道(List channels with at least one subscriber)
通过PUBSUB CHANNELS
命令,可以列出当前至少有一个订阅者的频道。
PUBSUB CHANNELS
示例: 如果我们有两个频道,分别是news
和weather
,并且有两个订阅者分别订阅了这两个频道,那么使用如下命令:
PUBSUB CHANNELS
将返回:
1) "news"
2) "weather"
7.列出给定频道的订阅者数量(List number of subscribers for a given channel)
通过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"
8.列出被订阅模式的数量(List number of subscribed patterns)
使用PUBSUB NUMPAT
命令,可以列出当前被订阅模式的数量。
PUBSUB NUMPAT
示例: 在上述的订阅模式示例中,假设当前有两个被订阅的模式,我们可以使用如下命令:
PUBSUB NUMPAT
将返回:
1) "2"
9.订阅者模式(Subscriber Mode)
除了使用SUBSCRIBE
命令以外,Redis还提供了一种以订阅者模式来接收消息的方式。通过将订阅者连接标记为SUBSCRIBE
,它将接收到的消息转发给其他客户端,作为它们的订阅者。这种方式可以用于构建分布式系统或代理模式。
示例: 我们创建一个订阅者模式的订阅者,在一个SUBSCRIBE
连接上使用如下命令:
SUBSCRIBE
案例:
假设我们有一个新闻发布系统,其中一个组件是一个代理订阅者,它会将接收到的新闻消息转发给其他应用程序或服务。我们将使用Redis的订阅者模式来实现这个代理订阅者。
1.创建一个代理订阅者(Proxy Subscriber) 首先,在Redis中创建一个订阅者连接,并标记为SUBSCRIBE
,如下所示:
SUBSCRIBE
这个连接会一直阻塞并等待接收消息。
????????2.创建其他应用程序或服务 接下来,我们创建两个应用程序或服务,它们订阅了不同的频道,并希望通过代理订阅者来接收新闻消息。
- 应用程序1订阅
news.sports
频道:
SUBSCRIBE news.sports
- 应用程序2订阅
news.politics
频道:
SUBSCRIBE news.politics
3.发布新闻 现在,让我们假设有一条新闻需要发布。发布者使用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!"
4.代理订阅者转发消息 当发布者发布消息后,代理订阅者会接收到这两条消息,并将它们转发给相应的应用程序或服务。应用程序1将接收到第一条消息,应用程序2将接收到第二条消息。这样,代理订阅者充当了信息转发的角色。
10.退订所有频道和模式(Unsubscribe all channels and patterns)
如果要退订订阅者已经订阅的所有频道和模式,可以使用UNSUBSCRIBE
命令,不带任何参数即可。
示例: 假设订阅者当前订阅了两个频道,news
和weather
,以及一个模式news.*
。要一次性退订所有频道和模式,可以在订阅者连接上使用如下命令:
UNSUBSCRIBE
11.订阅单个频道的阻塞(Blocking for a single-channel subscription)
Redis Pub/Sub还支持以阻塞模式订阅单个频道。使用SUBSCRIBE
命令后,订阅者连接会一直阻塞,直到有消息发布到指定频道。
示例: 假设我们有一个频道messages
,我们可以创建一个阻塞订阅者连接,并订阅该频道,如下所示:
SUBSCRIBE messages
这将阻塞订阅者连接,直到有消息在messages
频道上发布。
注意事项:
- 支持的并发连接数:Redis默认的最大客户端连接数是10000。当使用大量的订阅者或发布者时,要确保Redis服务器足够支持所需的并发连接数。
- 消息持久化:Redis的发布订阅模块不会持久化消息。如果需要将消息保存到磁盘并在重启后恢复,可以使用Redis的持久化功能,如RDB快照或AOF日志。
- 消息顺序性:Redis的发布订阅模块不保证消息的顺序性。如果应用程序对消息的顺序有要求,需要在应用层进行处理。
- 网络延迟:由于Redis使用TCP协议进行通信,存在网络延迟的可能性。在高延迟的网络环境中,消息的传递可能会有一定的延迟。
?
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!