向爬虫而生---Redis 拓宽篇2 <Pub/Sub发布订阅>

发布时间:2024年01月07日

前言:

受甲流影响,这几天瘫卧在床,没有及时更新...希望大家在学习之余,一定也要注意身体,这鬼甲流太厉害了!!

接着上文:向爬虫而生---Redis 拓宽篇1 < pipeline传输效率>-CSDN博客

为什么非要讲一下这个发布订阅问题呢?因为Redis的发布订阅模块与Scrapy爬虫可以结合使用,以实现分布式爬取和数据处理

  1. 分布式消息队列:Scrapy可以使用Redis的发布订阅模块作为分布式消息队列,在多个爬虫节点之间共享URL或任务。发布者将待爬取的URL发布到指定频道,而订阅者在不同的节点上订阅该频道,接收URL并执行相应的爬取任务。
  2. 实时数据处理:使用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.sportsnews.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

示例: 如果我们有两个频道,分别是newsweather,并且有两个订阅者分别订阅了这两个频道,那么使用如下命令:

PUBSUB CHANNELS

将返回:

1) "news"
2) "weather"

7.列出给定频道的订阅者数量(List number of subscribers for a given channel)

通过PUBSUB NUMSUB命令,可以列出给定频道的订阅者数量。可以一次性给出多个频道,返回每个频道及其对应的订阅者数量。

PUBSUB NUMSUB channel [channel ...]

示例: 假设有三个频道:newsweathersports,分别有两个、三个和一个订阅者。我们可以使用以下命令:

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.sportsnews.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命令,不带任何参数即可。

示例: 假设订阅者当前订阅了两个频道,newsweather,以及一个模式news.*。要一次性退订所有频道和模式,可以在订阅者连接上使用如下命令:

UNSUBSCRIBE

11.订阅单个频道的阻塞(Blocking for a single-channel subscription)

Redis Pub/Sub还支持以阻塞模式订阅单个频道。使用SUBSCRIBE命令后,订阅者连接会一直阻塞,直到有消息发布到指定频道。

示例: 假设我们有一个频道messages,我们可以创建一个阻塞订阅者连接,并订阅该频道,如下所示:

SUBSCRIBE messages

这将阻塞订阅者连接,直到有消息在messages频道上发布。

注意事项:

  1. 支持的并发连接数:Redis默认的最大客户端连接数是10000。当使用大量的订阅者或发布者时,要确保Redis服务器足够支持所需的并发连接数。
  2. 消息持久化:Redis的发布订阅模块不会持久化消息。如果需要将消息保存到磁盘并在重启后恢复,可以使用Redis的持久化功能,如RDB快照或AOF日志。
  3. 消息顺序性:Redis的发布订阅模块不保证消息的顺序性。如果应用程序对消息的顺序有要求,需要在应用层进行处理。
  4. 网络延迟:由于Redis使用TCP协议进行通信,存在网络延迟的可能性。在高延迟的网络环境中,消息的传递可能会有一定的延迟。

?

文章来源:https://blog.csdn.net/m0_56758840/article/details/135438444
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。