Computer >> 컴퓨터 >  >> 프로그램 작성 >> Redis

Redis Pub/Sub:방법 가이드

Redis pub/sub에 대한 개요 기사에서는 pub/sub의 목적에 대해 설명하고 특히 Redis pub/sub의 디자인 선택에 대해 설명합니다. 이제 Redis pub의 각 주요 개념을 단계별로 살펴보고 Redis pub/sub를 사용하는 방법을 살펴보겠습니다. /sub:noderedis node.js 클라이언트를 사용하여 채널, 게시, 구독 및 패턴 일치.

채널 이해

채널 pub/subsystem에 게시된 메시지를 분류하는 데 사용되는 이름입니다. 채널은 system-health:i-36a44b83과 같은 시스템 종속 이름을 가질 수 있습니다. ,trade-prices:RAX , temp-reading:living-room 또는 events와 같은 매우 일반적인 것 . 채널에 표시되는 데이터에 관심이 있는 모든 구독자는 이를 들을 수 있으며 시스템이 성장함에 따라 새로운 게시자와 구독자가 쉽게 추가됩니다.

Redis 서버에서 활성화된 채널을 찾으려면 PUBSUB CHANNELS를 사용할 수 있습니다. 시스템이 아직 게시/구독에 사용되지 않을 때 아무 것도 반환하지 않는 명령:

$ redis-cli pubsub channels
(empty list or set)

채널은 구독자가 메시지를 수신할 때만 시스템에 존재하므로 채널을 "생성"하거나 "제거"할 필요가 없습니다. 채널은 구독자가 듣고 있는 동안에만 존재합니다. 이를 보려면 redis-cli를 사용할 수 있습니다. 하나의 콘솔 창에서 구독자 역할을 하고 PUBSUB CHANNELS를 실행합니다. 다른 창에서 다시:

콘솔 1:

$ redis-cli subscribe events
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "events"
3) (integer) 1

콘솔 2:

$ redis-cli pubsub channels
1) "events"

콘솔 1의 연결이 끊어지면 시스템에 다시 채널이 없게 됩니다.

메시지 게시

명령 구문

PUBLISH 명령은 메시지를 게시하는 데 사용됩니다.

PUBLISH channel message

채널을 듣고 있는 모든 구독자에게 메시지가 전송됩니다. 메시지를 수신할 구독자가 없으면 메시지가 삭제됩니다.

Node.js 예제

Redis에 대한 일반 연결을 생성한 후에는 다른 명령처럼 publish를 사용할 수 있습니다.

var client = require("redis").createClient();
client.publish("temp-reading:living-room", "37.0");

다른 Redis 명령과 함께 사용

채널에 데이터를 게시하는 것은 빠른 작업이므로 일반적으로 다른 작업과 함께 사용됩니다. 이와 같은 작업을 결합하면 Redis의 힘이 발휘됩니다.

var client = require("redis").createClient();

client.multi()
  .publish("temp-reading:living-room", "37.0")
  .lpush("recent-temperatures", "37.0")
  .ltrim("recent-temperatures", 0, 99)
  .exec();

이것은 pub/sub 시스템에 대한 이전 예제와 동일한 작업이지만 동일한 MULTI/EXEC 트랜잭션 온도는 또한 100개의 가장 최근 온도를 유지하는 목록에 푸시됩니다.

이 짧은 예는 Redis pub/sub를 메시지 기록을 포함하는 더 큰 시스템 디자인에 통합하는 방법을 보여줍니다. 위와 같은 작업을 통해 다른 클라이언트가 최근 값을 쿼리하고 새 값을 구독할 수 있습니다.

메시지 구독

명령 구문

SUBSCRIBE 명령은 채널을 구독하는 데 사용됩니다. 이 명령은 클라이언트를 추가 SUBSCRIBE 이외의 명령을 더 이상 보내지 않는 특별한 "구독" 상태로 만듭니다. 또는 UNSUBSCRIBE 명령.

SUBSCRIBE channel [channel ...]

Node.js 예제

이 구독자는 이전 게시자 예제와 함께 사용할 수 있습니다.

var subscriber = require("redis").createClient();

subscriber.on("message", function(channel, message) {
  console.log("A temperature of " + message + " was read.");
});

subscriber.subscribe("temp-reading:living-room");

이것은 메시지가 도착할 때마다 함수를 호출하는 간단한 이벤트 이미터를 사용합니다. 핸들링 기능은 현재 콘솔에 온도를 기록하기만 하면 됩니다. 무엇이든 할 수 있습니다.

가입자와 함께 다른 명령 사용

앞서 언급했듯이 가입된 클라이언트는 특수 모드에 있으며 다른 명령에 사용할 수 없습니다. 다른 명령을 사용하려면 Redis에 대한 별도의 클라이언트 연결을 만듭니다.

var redis = require("redis")
  , subscriber = redis.createClient()
  , client = redis.createClient();

subscriber.on("message", function(channel, message) {
  console.log("A temperature of " + message + " was read.");
  client.incr("temp-count");
});

subscriber.subscribe("temp-reading:living-room");

이 핸들러는 메시지를 콘솔에 기록하고 Redis 카운터를 증가시킵니다. 경우에 따라 결과를 계산한 다음 다른 구독자가 읽을 수 있도록 해당 결과를 별도의 채널에 게시할 수 있습니다. 무한 루프가 발생할 수 있으므로 듣고 있는 동일한 채널에 다시 게시하지 마십시오. :)

패턴 매칭

명령 구문

PSUBSCRIBE 명령은 채널 패턴을 일치시키는 데 사용됩니다.

PSUBSCRIBE pattern [pattern ...]

이것은 일반 SUBSCRIBE와 동일하게 작동합니다. 명령을 사용하지만 패턴과 일치하는 이름으로 채널을 일치시킬 수 있습니다. 이를 통해 게시자는 자신이 게시하는 정보에 대해 매우 구체적으로 알 수 있으며 구독자는 정확한 이름을 몰라도 많은 채널을 들을 수 있습니다.

지원되는 패턴은 간단합니다. * 모든 문자와 일치합니다. ? 단일 문자와 일치하고 대괄호를 사용하여 [acd]와 같은 허용 가능한 문자 집합과 일치시킬 수 있습니다. .

여러 방의 온도 판독값 일치:

PSUBSCRIBE temp-reading:*

site-link:logo:a:clickrate와 같은 A/B 테스트의 일치 이벤트 및 site-link:logo:b:clickrate :

PSUBSCRIBE site-link:logo:?:clickrate

system-health:us-east-1a:i-36a44b83과 같은 게시된 이벤트에 대해 일련의 AWS 인스턴스에서 이벤트 일치 및 system-health:us-east-1c:i-73657420636f636f6 :

PSUBSCRIBE system-health:us-east-1[acd]:i-*

Node.js 예제

이전 게시 예제와 함께 사용할 수도 있는 이 예제에서 온도는 온도를 읽은 방과 함께 기록됩니다.

var subscriber = require("redis").createClient();

subscriber.on("pmessage", function(pattern, channel, message) {
  var room = channel.split(":")[1];
  console.log("A temperature of " + message + " was read in " + room);
});

subscriber.psubscribe("temp-reading:*");

패턴 기반 구독자는 콜백에서 몇 가지 더 자세한 정보를 얻습니다. 채널 및 메시지뿐만 아니라 일치된 특정 패턴 - 구독자는 여러 채널 또는 패턴에서 수신할 수 있기 때문입니다.

보조 참고:PUBLISH의 성능 특성

Redis의 모든 명령에는 문서화된 시간 복잡성이 있으며 이러한 복잡성은 대부분 직관적입니다. PUBLISH 이후 작업은 매우 간단합니다(거의 SET ) 복잡도가 O(1)이라고 가정할 수 있습니다. 사실 PUBLISH의 시간 복잡도 구독자의 행동에 따라 선형적으로 성장합니다.

PUBLISH 명령은 채널 과 일치할 수 있는 구독된 모든 패턴을 단계별로 실행해야 합니다. 메시지를 수신해야 하는 모든 가입자는 O(N+M)의 시간 복잡도를 초래합니다.

대부분의 배포에서는 PUBLISH의 복잡성으로 인해 성능 문제가 발생하지 않습니다. , 하지만 시간이 지남에 따라 해당 명령의 성능을 추적하는 것은 여전히 ​​현명합니다. 코드에서 청취할 채널 패턴을 자동으로 생성하는 경우 주의하십시오.

여기에 코드가 있습니까?

Redis pub/sub를 사용하여 빌드된 앱의 몇 가지 훌륭한 예를 소개하고자 합니다. 몇 가지 좋은 예를 알고 있다면 [email protected]으로 메모를 보내주세요. 우리가 보는 코드 중 일부를 소개하기 위해 최선을 다하겠습니다.