Redis pub/sub 소개
- Development/Hadoop, NoSQL, BigData
- 2021. 6. 17.
Redis pub/sub 소개
일반적인 pub/sub의 개념에서 알 수 있듯이, 메시지를 보내는 publish와 그 메시지를 수신할 수 있는 subscribe를 말한다. Kafka와는 달리, Redis에서는 subscribe가 된 상태의 클라이언트만 publish되는 메시지를 받을 수 있다. 쉽게 생각하면, Youtube 채널 구독과 비슷하다. 구독과 좋아요를 누르면, 나중에 새로운 글이 올라오면 노티가 올텐데, 구독중인 상태의 채널에 신규 콘텐츠가 올라오면 노티를 받을 수 있는 것과 같다.
명령어
- Redis 서버를 매개로, Redis 클라이언트간 통신을 도와줌
- Redis 클라이언트는 Redis 서버내 "채널"을 생성함
- 메시지를 수신하고 싶은 클라이언트는 사전에 해당 채널을 subscribe 함
- 메시지를 보내는 클라이언트는 해당 채널에 메시지를 publsih할 수 있음
- 메시지를 보내는 클라이언트가 메시지를 publish하면, subscribe 중인 클라이언트만 메시지를 수신함
PUBSUB
127.0.0.1:6379> help pubsub
PUBSUB subcommand [argument [argument ...]]
summary: Inspect the state of the Pub/Sub subsystem
since: 2.8.0
group: pubsub
127.0.0.1:6379> pubsub help
1) PUBSUB <subcommand> [<arg> [value] [opt] ...]. Subcommands are:
2) CHANNELS [<pattern>]
3) Return the currently active channels matching a <pattern> (default: '*').
4) NUMPAT
5) Return number of subscriptions to patterns.
6) NUMSUB [<channel> ...]
7) Return the number of subscribers for the specified channels, excluding
8) pattern subscriptions(default: no channels).
9) HELP
10) Prints this help.
일단은, 먼저 현재 상태를 조회하는 명령어부터 살펴보자. 위의 help에서 보이듯이, PUBSUB 명령어는 CHNNAELS/NUMPAT/NUMSUB의 subcommand를 포함하고 있다.
// 활성화된 채널이 없을 때
127.0.0.1:6379> pubsub channels
(empty array)
// 아래의 SUBSCRIBE 명령어로 채널을 한 개 활성화 시켰을 때
127.0.0.1:6379> pubsub channels
1) "c1"
// 채널을 구독중인 클라이언트 수 확인
127.0.0.1:6379> pubsub numsub c1
1) "c1"
2) (integer) 1
127.0.0.1:6379> pubsub numsub c2
1) "c2"
2) (integer) 0
// 패턴형으로 등록된 클라이언트 수 확인
127.0.0.1:6379> pubsub numpat
(integer) 0
SUBSCRIBE
127.0.0.1:6379> help subscribe
SUBSCRIBE channel [channel ...]
summary: Listen for messages published to the given channels
since: 2.0.0
group: pubsub
파라미터로 명시한 채널을 구독한다. 여러 개의 채널을 동시에 구독할 수도 있다.
// 채널을 개설함: 이제 누가 나한테 연락하려면 c1이라고 부르면 됨
127.0.0.1:6379> subscribe c1
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "c1"
3) (integer) 1
127.0.0.1:6379> subscribe c1 c2
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "c1"
3) (integer) 1
1) "subscribe"
2) "c2"
3) (integer) 2
위와 같이 여러 개의 채널을 등록하면, 각각의 채널로 메시지가 발행되면 모두 수신한다.
PUBLISH
127.0.0.1:6379> help publish
PUBLISH channel message
summary: Post a message to a channel
since: 2.0.0
group: pubsub
채널에 메시지를 발행한다.
// 채널 c1에 메시지를 발행했고, 2개의 클라이언트에게 전달되었음
127.0.0.1:6379> publish c1 "test 1"
(integer) 2
// 채널 c2에 메시지를 발행했고, 1개의 클라이언트에게 전달되었음
127.0.0.1:6379> publish c2 "test 1"
(integer) 1
PSUBSCRIBE
127.0.0.1:6379> help psubscribe
PSUBSCRIBE pattern [pattern ...]
summary: Listen for messages published to channels matching the given patterns
since: 2.0.0
group: pubsub
수신할 채널 이름의 패턴을 등록한다.
// 패턴을 등록하여 수신시작
127.0.0.1:6379> 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
// 등록하지 않았던 채널 c2로 메시지 보냄
127.0.0.1:6379> publish c2 "test 2"
(integer) 1
// 패턴으로 구독 신청한 채널에 메시지가 추가됨
127.0.0.1:6379> 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"
UNSUBSCRIBE, PUNSUBSCRIBE
127.0.0.1:6379> help unsubscribe
UNSUBSCRIBE [channel [channel ...]]
summary: Stop listening for messages posted to the given channels
since: 2.0.0
group: pubsub
127.0.0.1:6379> help punsubscribe
PUNSUBSCRIBE [pattern [pattern ...]]
summary: Stop listening for messages posted to channels matching the given patterns
since: 2.0.0
group: pubsub
redis-cli에서는 ctrl+c로 곧바로 멈출 수 있지만, 별도 클라이언트로 붙었다면 unsubscribe 명령어를 통해 수신을 중단한다. 마찬가지로 punsubscribe 명령어로 일치하는 패턴의 채널 수신을 중단한다.
'Development > Hadoop, NoSQL, BigData' 카테고리의 다른 글
Hive - Queries against partitioned tables without a partition filter are disabled for safety reasons 에러 처리 (0) | 2022.12.28 |
---|---|
Redis Geo - Geospatial 명령어 (0) | 2021.06.07 |
Redis 자료 구조 - ZSet (Sorted Set) (0) | 2021.06.02 |
Redis 자료 구조 - Hash (0) | 2021.05.27 |
Redis 자료 구조 - Set (0) | 2021.05.12 |
Redis 자료 구조 - List (0) | 2021.05.10 |
Redis 자료 구조 - String (0) | 2021.05.06 |
Memcached vs. Redis - 특징 비교 (0) | 2021.05.03 |