해당 토픽을 "Sub"한 다른 모든 클라이언트는 해당 Topic에서 "Pub"되는 메시지를수신합니다.
MSDN blog
Topic이라는 매개체를 통해서 메시지를 전달하므로
수신자와 발신자가 서로를 알지 못하더라도 메시지를 송수신할 수 있습니다.
특징
메시지는 Redis에 저장되지 않고 채널을 구독하는 클라이언트에 실시간으로 전송된다는 점에 유의해야 합니다.
클라이언트에게 전달되면 이를 바로 삭제합니다.
예시
이를 통해 Redis 지원 애플리케이션에서 실시간 메시징 및 알림을 구현할 수 있습니다.
예를 들어 채팅 애플리케이션은 pub/sub를 사용하여 한 사용자에서 다른 사용자에게 실시간으로 메시지를 보낼 수 있습니다.
애플리케이션에는 각 대화에 대한 채널이 있고
대화에 참여하는 클라이언트는 해당 채널을 구독합니다.
사용자가 메시지를 보내면 애플리케이션은 해당 채널에 메시지를 게시하고
해당 채널을 구독하는 다른 모든 클라이언트는 실시간으로 메시지를 수신합니다.
👎 따라서 메시지를 저장하여 관리해야 되는 경우, Redis의 Pub/Sub은 적합하지 않을 수 있습니다.
👍 예를 들어 PUSH 메시지처럼 실시간으로 로그인된 사용자에게 메시지를 전달하는 기능을 구현할 경우, 유용하게 사용될 것입니다.
명령어
Commands
Syntax
Description
subscribe
channel [channel...]
채널을 구독하여, 메시지를 수신받음 (동시에 여러개 구독 가능)
publish
channel message
메시지 지정한 채널로 송신
pubsub
subcommand [argument [argument ...]]
서버에 등록된 채널이나 패턴을 조회
psubscribe
pattern [pattern ...]
채널 이름을 패턴으로 등록
unsubscribe
[channel [channel ...]]
subscribe로 등록한 채널 구독 해제
punsubscribe
[pattern [pattern ..]]
psubscribe로 등록한 패턴 채널 구독 해제
subscribe 명령어
파라미터로 명시한 채널을 구독합니다. 여러 개의 채널을 동시에 구독할 수 있습니다.
결과값 : 구독한 채널명, integer값 반환
> subscribe <채널명>
> subscribe <채널명1> <채널명2> ... # 여러 개의 채널을 등록하면, 각각의 채널로 메시지가 발행되면 모두 수신한다.
✔️ redis에서 channel을 생성하는 명령어는 없고, subscribe로 채널을 생성하고 구독하는 것으로 보면 됩니다.
publish 명령어
이제 ch1을 구독하는 subscriber가 생겼으므로,
publisher client에서 publish 명령어를 사용해 메시지를 발행하면
subscriber client에서 해당 메시지를 전달받게 됩니다.
> publish <채널> <내용>
(integer) 2 # 채널에 메시지를 발행했고, 2개의 클라이언트에게 전달되었음
publishersubscriber
pubsub 명령어
administrator가 효율적으로 subscriber를 관리할 수 있도록 하는 명령어입니다.
channels : 활성화 된 채널
numsub : 특정 채널을 구독하고 있는 subscriber의 개수 확인
pattern subscription으로 구독하고 있는 subscriber는 count에 포함되지 않음
numpat : pattern subscription의 subscriber 개수 확인
특정 채널의 subscriber가 아닌, 전체 subscriber 개수 return
# 활성화된 채널이 없을 때
> pubsub channels
(empty array)
# 아래의 SUBSCRIBE 명령어로 채널을 한 개 활성화 시켰을 때
> pubsub channels
1) "c1"
# 채널을 구독중인 클라이언트 수 확인
> pubsub numsub ch1
1) "ch1"
2) (integer) 1
# 패턴형으로 등록된 클라이언트 수 확인
> pubsub numpat
(integer) 0
psubscribe 명령어
수신할 채널 이름의 패턴을 등록하는 명령어입니다.
패턴은 아래와 같은 glob-style을 지원합니다.
'?' : 한 글자 대치
'*' : 공백이나 여러 글자 대치
# 패턴을 등록하여 수신시작
> psubscribe c*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "c*"
3) (integer) 1
# 패턴 채널을 등록된 채널에는 포함되지 않음
127.0.0.1:6379> pubsub channels
1) "c1"
# 패턴 조회 : 1개 확인
127.0.0.1:6379> pubsub numpat
(integer) 1
# 등록하지 않았던 채널 ch2로 메시지 보냄
> publish ch2 "test 2"
(integer) 1
# 패턴으로 구독 신청한 채널에 메시지가 추가됨
> psubscribe c*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "c*"
3) (integer) 1
1) "pmessage"
2) "c*"
3) "c2"
4) "test 2"