redis pub/sub 이해하기
먼저 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://realmojo.tistory.com/170
'Database > redis' 카테고리의 다른 글
django MQ 시리즈 4편 - celery with redis for pub/sub (1) | 2023.10.09 |
---|---|
실무에서 redis를 사용한 시스템 구축 사례 정리 (0) | 2023.10.08 |
우분투 22.04 redis 관리 툴 설치하기 redis-desktop-manager (0) | 2023.03.16 |
댓글