>  기사  >  데이터 베이스  >  Redis 게시/구독 모델 예시 분석

Redis 게시/구독 모델 예시 분석

WBOY
WBOY앞으로
2023-05-27 21:29:321682검색

Redis 게시/구독 애플리케이션

게시 및 구독(pub/sub)은 메시지 게시자와 메시지 구독자 간의 연결을 분리하는 것이 주요 목적입니다. 이는 디자인 패턴의 관찰자와 유사합니다. 비교적 비슷합니다. pub/sub는 게시자와 구독자의 직접적인 코드 수준 결합을 해결할 뿐만 아니라 물리적 배포에서 둘의 결합도 해결합니다. 게시/구독 서버로서 redis는 구독자와 게시자 간의 메시지 라우팅 기능을 수행합니다. 구독자는 subscribe 및 psubscribe 명령을 통해 관심 있는 메시지 유형에 대해 Redis 서버를 구독할 수 있습니다. 게시자가 게시 명령을 통해 Redis 서버에 특정 유형의 메시지를 보내는 경우. 이 메시지 유형을 구독하는 모든 클라이언트는 이 메시지를 받게 됩니다. 여기서 메시지 전달은 다대다 방식입니다. 클라이언트는 여러 채널을 구독하고 여러 채널에 메시지를 보낼 수 있습니다.

기본 명령부터 시작해 보겠습니다.

PSUBSCRIBE pattern [pattern ...]              #订阅一个或多个符合给定模式的频道;PUBSUB subcommand [argument [argument ...]]   #查看订阅与发布系统状态;PUBLISH channel message                       #将信息发送到指定的频道;PUNSUBSCRIBE [pattern [pattern ...]]          #退订所有给定模式的频道;SUBSCRIBE channel [channel ...]               #订阅给定的一个或多个频道的信息;UNSUBSCRIBE [channel [channel ...]]           #指退订给定的频道;

redis 매뉴얼에서 볼 수 있듯이 실제로 "publish and subscribe" 모드에는 6개의 명령만 있습니다.

SUBSCRIBE

하나 이상의 채널에 대해 제공된 정보를 구독하세요.

SUBSCRIBE channel [channel ...]

위의 공식 설명으로 볼 때, 게임 플레이는 실제 생활에서 라디오를 듣는 것과 약간 비슷합니다. 라디오를 듣고 싶다면 어떻게 해야 할까요? FM이어야 합니다. 올바른 채널에서만 좋은 프로그램을 들을 수 있습니다. 따라서 구독하려면 먼저 채널을 구독해야 합니다. 아래에 두 개의 클라이언트를 열고 각각 메시지 채널을 구독하겠습니다. 다음과 같습니다:

root@localhost:~ # redis-cli -p 6379127.0.0.1:6379> SUBSCRIBE msg
Reading messages... (press Ctrl-C to quit)
1) "subscribe"2) "msg"3) (integer) 1

root@localhost:~ # redis-cli -p 6379127.0.0.1:6379> SUBSCRIBE msg
Reading messages... (press Ctrl-C to quit)
1) "subscribe"2) "msg"3) (integer) 1

SUBSCRIBE는 여러 채널을 구독할 수도 있으므로 수신되는 정보는 여러 채널에서 올 수 있습니다.

PUBLISH

지금까지 이 두 구독자는 msg 채널을 모니터링하고 있습니다. 다음으로, msg 채널에서 소식이 있으면 반드시 구독으로 수신됩니다. 먼저 redis 매뉴얼을 살펴보겠습니다. 이 명령.

지정된 채널 채널로 정보 메시지를 보냅니다.

PUBLISH channel message

다음 데모:

Redis 게시/구독 모델 예시 분석

보세요, 메시지를 게시한 후 메시지를 구독으로 모니터링한 다음 별도로 인쇄합니다. 자, 지금까지는 가장 기본적인 게시입니다. 이것이 구독 모델입니다. .아주 간단하지 않나요? 실제로? ? ? 그렇게 간단하지만 때로는 여전히 필요한 경우가 있습니다. 즉, 키를 퍼지 일치시킬 수 있습니까? 예를 들어, 접두어가 china인 모든 채널을 구독해야 합니다. 이것이 가능하다면 정말 좋을 것입니다. . . 내가 대답한다면 강력한 Redis가 분명히 그것을 할 수 있을 것이고 PSUBSCRIBE 명령을 제공할 것입니다.

PSUBSCRIBE

특정 패턴과 일치하는 하나 이상의 채널을 구독하세요. 각 패턴은 를 일치자로 사용합니다. 예를 들어 it은 해당 패턴으로 시작하는 모든 채널과 일치합니다(it.news, it.blog, it.tweets). etc.), news.*는 news로 시작하는 모든 채널(news.it, news.global.today 등)과 일치합니다.

PSUBSCRIBE pattern [pattern ...]

위 설명을 보고 '이건 그냥 일반 매칭이 아니지?'라고 생각하실 수도 있겠네요. . . 다음으로, 접두어 "P"는 "Pattern"을 의미하므로 접두어가 "china"인 모든 채널을 구독하겠습니다. .

Redis 게시/구독 모델 예시 분석

PSUBSCRIBE는 다양한 패턴과 일치하는 여러 매개변수를 받을 수 있습니다. 작은 예제를 읽은 후에는 pub/sub 기능을 지각적으로 이해해야 합니다. 연결이 subscribe 또는 psubscribe 구독 채널을 통과하면 구독 모드로 들어간다는 점에 유의해야 합니다. 이 모드에서는 추가 채널을 구독하거나 unsubscribe 또는 punsubscribe 명령을 사용하여 구독 모드를 종료하는 것 외에는 다른 명령을 보낼 수 없습니다. 또한 psubscribe 명령을 사용하여 여러 와일드카드 채널을 구독하면 메시지가 여러 채널 패턴과 일치하는 경우 동일한 메시지가 여러 번 수신됩니다.

Redis의 pub/sub 구현에는 150줄의 코드만 필요하지만 기능이 충분하지 않을 수 있습니다. 보안, 인증, 신뢰성 측면에서 지원이 많지 않습니다.

Redis 게시/구독 메커니즘

클라이언트가 PUBLISH 명령을 통해 구독자에게 정보를 보낼 때 우리는 클라이언트를 게시자라고 부릅니다.

클라이언트가 SUBSCRIBE 또는 PSUBSCRIBE 명령을 사용하여 정보를 수신하면 클라이언트를 구독자라고 부릅니다.

게시자와 구독자 간의 관계를 분리하기 위해 Redis는 채널을 둘 사이의 중개자로 사용합니다. 게시자는 정보를 채널에 직접 게시하고 채널은 다음 작업을 담당합니다. 메시지는 게시자와 구독자에게 전송됩니다. 구독자는 상호 관계가 없으며 서로의 존재를 모릅니다:

Redis 게시/구독 모델 예시 분석

知道了发布和订阅的机制之后,接下来就可以开始研究具体的实现了,我们从Redis的订阅命令开始说起。

SUBSCRIBE命令的实现

前面说到,Redis将所有接受和发送信息的任务交给channel来进行,而所有channel的信息就储存在redisServer这个结构中:

struct redisServer {
  // 省略 ...
  dict *pubsub_channels; // Map channels to list of subscribed clients
  // 省略 ...
};

pubsub_channels是一个字典,字典的键就是一个个channel,而字典的值则是一个链表,链表中保存了所有订阅这个channel的客户端。

举个例子,如果在一个 redisServer 实例中,有一个叫做 news 的频道,这个频道同时被client_123 和 client_456 两个客户端订阅,那么这个 redisServer 结构看起来应该是这样子: Redis 게시/구독 모델 예시 분석

可以看出,实现SUBSCRIBE命令的关键,就是将客户端添加到给定channel的订阅链表中。

PSUBSCRIBE命令的实现

除了直接订阅给定channel外,还可以使用PSUBSCRIBE订阅一个模式(pattern),订阅一个模式等同于订阅所有匹配这个模式的channel 。

和redisServer.pubsub_channels属性类似,redisServer.pubsub_patterns属性用于保存所有被订阅的模式,和pubsub_channels不同的是, pubsub_patterns是一个链表(而不是字典):

struct redisServer {
  // 省略 ...
  list *pubsub_patterns; // A list of pubsub_patterns
  // 省略 ...
};

pubsub_patterns 的每一个节点都是一个 pubsubPattern 结构的实例,它保存了被订阅的模式,以及订阅这个模式的客户客户端:

typedef struct pubsubPattern {
  redisClient *client;
  robj *pattern;
} pubsubPattern;

举个例子,假设在一个 redisServer 实例中,有一个叫做 news.* 的模式同时被客户端client_789 和 client_999 订阅,那么这个 redisServer 结构看起来应该是这样子: Redis 게시/구독 모델 예시 분석

现在可以知道,实现PSUBSCRIBE命令的关键,就是将客户端和订阅的模式添加到redisServer.pubsub_patterns当中。

위 내용은 Redis 게시/구독 모델 예시 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제