Database/redis

redis pub/sub 이해하기

bluebamus 2023. 4. 29.

먼저 redis를 학습하면서 mq와 pub/sub에 대한 차이를 명확하게 이해하지를 못해 헤매고 있었다.

 

그리고 금일 코딩을 할 수 없는 상황이라 그냥 학습이나 하자는 생각에 시작한 간단한 테스트를 통해

차이를 명확하게 이해할 수 있었다.

 

주요 차이점은 메시지 저장과 메시지 전송의 스코프로 정의할 수 있다.

 

1. redis-cli를 여러개 띄우고 각 db의 상태를 한단계 진행할 때마다 확인을 해보니 전송된 메시지는 그 어느 곳에도 저장되지 않는다는 것이다.

 말 그대로 {키:데이터} 형식의 저장 단계는  그 어느 곳에서도 이루어 지지 않고 자체적으로 정의된 채널로 바로 전달하고 종료를 한다는 것이다.

 이로 인해 redis의 pub/sub은 구독자의 메시지 수신 여부를 보장할 수 없다는 것이다. 메시지를 보내는 그 순간, 구독을 통해 대기하고 있지 않으면 메시지는 받을 수 없다

 

2. pub/sub은 데이터베이스 번호를 포함하여 어떤 레벨에서도 방해받지 않도록 설계되어 있다는 것이다.

 이 말은 현재 연결되어 있는 데이터베이스가 어떤 번호이든, 원하는 채널로 메시지를 발행할 수 있다는 것이고, 구독자 또한 어떤 데이터베이스 번호에 연결 되어 있든, 구독을 하는데 전혀 문제가 없다는 것이다.

 

주요 명령어 정리

메시지 발행

Commands Syntax Description
publish channel message 메시지를 지정한 채널로 송신

메시지 구독

Commands Syntax Description
subscribe channel [channel ...] 채널을 구독하여, 메세지 수신
(동시 여러 채널 구독 가능)
psubscribe pattern [pattern ...] 채널 이름을 패턴으로 등록

구독 해제

Commands Syntax Description
unsubscribe [channel [channel ...]] subscribe로 등록한 채널 구독 해제
punsubscribe [pattern [pattern ...]] psubscribe로 등록한 패턴 채널 구독 해제

조회

Commands Syntax Description
pubsub subcommand [argument [argument ...]] 서버에 등록된 채널이나 패턴을 조회

 

publish 사용 방법

publish <채널> <메시지>
(integer) 2 # 총 2개의 클라이언트에게 메시지가 전달되었음

 

subscribe 사용 방법

> subscribe <채널명>

> subscribe <채널명1> <채널명2> ...

 

psubscribe 사용 방법

- '?' 는 채널이름 중 한 글자를 대치한다.

   - te?t라 정의하면  test, te1t, teet 등과 같이, 채널 이름 중 해당 위치의 모든 패턴을 의미한다.

- '*' 는 공백이나 길이에 제약 없는 글자 패턴을 대치한다.

   - te*t라 정의하면 tet, teeeeest, tessssssst, te3ccvdfsftt 등 정의된 글자와 매칭되면 제약 없는 모든 패턴을 의미한다.

- []는 제한적으로 정의된 문자만 허용한다.

   - te[sd]t는 s 혹은 d만 올 수 있다. test, tedt만 허용된다.

# 패턴을 등록 및 수신 시작
> psubscribe te*t1
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "te*t1"
3) (integer) 1


# 패턴 조회 (패턴 전체 구독자 수)
127.0.0.1:6379> pubsub numpat
(integer) 1

# 현재 등록된 test1가 아닌 tedt1으로 메시지 전송
> publish tedt1 "test msg"
(integer) 1

# 패턴으로 구독 신청한 채널에 메시지가 추가됨
> psubscribe te*t1
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "te*t1"
3) (integer) 1
1) "pmessage"
2) "te*t1"
3) "tedt1"
4) "test msg"

 

unsubscribe / punsubscribe 사용 방법

- 채널명을 입력하지 않으면 현재 클라이언트에 등록된 모든 채널들이 삭제된다.

> unsubscribe test1

> punsubscribe test*

 

pubsub 사용 방법

- pubsub channels : 현재 활성화 된 채널 정보 확인

- pubsub numsub : 특정 채널을 구독하고 있는 구독자 수 확인

   - 패턴으로 구독하고 있는 구독자들은 수에 포함되지 않음

- pubsub numpat : 패턴으로 구독하고 있는 구독자들의 수 확인

   - 패턴 구독의 특징상 특정 채널에 포함되는 구독자가 아닌, 패턴 구독자 전체 수를 제공함

 

# 채널이 없는 경우
> pubsub channels
(empty array)

# 채널이 있는 경우
> pubsub channels
1) "test1"

# 특정 채널의 구독자 수 확인
> pubsub numsub test1
1) "test1"
2) (integer) 1

# 패턴형으로 등록된 구독자 수 확인
> pubsub numpat
(integer) 0

 

 

 

reference : 

https://inpa.tistory.com/entry/REDIS-%F0%9F%93%9A-PUBSUB-%EA%B8%B0%EB%8A%A5-%EC%86%8C%EA%B0%9C-%EC%B1%84%ED%8C%85-%EA%B5%AC%EB%8F%85-%EC%95%8C%EB%A6%BC

 

🗃️ REDIS의 PUB/SUB 기능 (채팅 / 구독 알림)

Redis Publish / Subscribe Publish / Subscribe 란 특정한 주제(topic)에 대하여 해당 topic을 구독한 모두에게 메시지를 발행하는 통신 방법으로 채널을 구독한 수신자(클라이언트) 모두에게 메세지를 전송 하

inpa.tistory.com

https://realmojo.tistory.com/170

 

[Redis] Pub/Sub 설명

PUB/SUB 설명 레디스를 사용하는 가장 큰 이유가 속도는 물론 아마 pub/sub 기능 때문이 아닐 까 싶다. SUBSCRIBE, UNSUBSCRIBE, PUBLISH는 게시자/구독자의 메시지 패러다임을 구현한다. 게시된 메시지는 구

realmojo.tistory.com

 

댓글