[Redis] 다양한 커맨드와 기능 소개

2022. 2. 27. 15:13TIL💡/Database

💚 Pub / Sub

메시지를 특정 수신자에게 직접 발송하지 못하는 곳에서 쓰이는 패턴 Publish-Subscribe(발송하다-구독하다)의 약자다.

발송자(Publisher)와 구독자(Subscriber)가 특정 채널을 리스닝하고 있다면, 발송자는 채널에 메시지를 보내고 구독자는 발송자의 메시지를 받는다.

 

레디스는 Pub/Sub 패턴을 지원하고, 메시지를 발송하고 채널을 구독하는 커맨드를 제공한다.

 

사용 예시

✨ 뉴스와 날씨 대시보드

✨ 채팅 애플리케이션

✨ 지하철 지연 경고 등의 푸시 알림

✨ SaltStack 툴이 지원하는 것과 유사한 리모트 코드의 실행

 

예제

발송자가 커맨드를 채널에 보내고, 채널을 구독한 서버는 해당 커내드를 실행하는 원격 커맨드 실행 시스템을 구현

 

PUBLISH 커맨드는 메시지를 레디스 채널에 보내고, 메시지를 받은 클라이언트 개수를 리턴한다.

메시지가 채널로 들어올 때, 채널을 구독하는 클라이언트가 없다면 메시지는 소실된다.

 

SUBSCRIBE 커맨드는 클라이언트가 하나 이상의 채널을 구독한다.

UNSUBSCRIBE 커맨드는 하나 이상의 채널에서 클라이언트를 구독 해지한다.

 

PSUBSCRIBE, PUNSUBSCRIBE 커맨드는 SUBSCRIBE, UNSUBSCRIBE 커맨드처럼 동일하게 작동하지만 채널 이름을 글로브(glob) 형태로 받는다.

 

레디스 클라이언트가 SUBSCRIBE, PSUBSCRIBE 커맨드를 시행한다면, 구독 모드로 들어가기 때문에 SUBSCRIBE, PSUBSCRIBE, UNSUBSCRIBE, PUNSUBSCRIBE 커맨드를 제외한 다른 커맨드를 받지 않는다.

루비로 웹 채팅 구현

https://gist.github.com/pietern/348262

 

redis_pubsub_demo.rb

GitHub Gist: instantly share code, notes, and snippets.

gist.github.com

PUBSUB 커맨드는 레디스의 Pub/Sub 시스템의 상태를 조사한다.

PUBSUB 커맨드는 3개의 하위 커맨드 CHANNELS, NUMSUB, NUMPAT를 받는다.

📌 CHANNELS

- 동작 중인 모든 채널을 리턴

 

📌 NUMSUB

- SUBSCRIBE 커맨드를 통해 채널과 접속한 클라이언트 개수를 리턴

- 많은 채널 이름을 매개변수로

 

📌 NUMPAT
- PSUBSCRIBE 커맨드를 통해 채널에 접속한 클라이언트 개수를 리턴

-  매개변수로 채널 패턴을 받지 않는다.

 

💚 트랜잭션

레디스의 트랜잭션은 순서대로 원자적으로 실행되는 커맨드의 열

MULTI 커맨드는 트랜잭션의 시작을 표시하고, EXEC 커맨드는 트랜잭션의 마지막을 표시한다.

MULTI와 EXEC 커맨드 간의 모든 커맨드는 직렬화되며 원자적으로 실행된다.

레디스는 트랜잭션의 처리 도중에 다른 클라이언트의 요청에 응하지 않는다.

 

트랜잭션의 모든 커맨드는 클라이언트의 큐에 쌓이고 EXEC 커맨드가 실행되면 서버로 전달된다.

EXEC 커맨드 대신 DISCARD 커맨드를 사용하며, 트랜잭션은 실행되지 않는다.

종종 레디스 클라이언트는 저장된 커맨드에서 문법 에러를 발견하면 레디스 서버로 전달될 트랜잭션이 실행되는 것을 막는다.

 

기존의 SQL 데이터베이스와 달리, 레디스의 트랜잭션은 트랜잭션 과정을 실행하다 실패하더라도 롤백하지 않는다.

레디스는 트랜잭션의 커맨드를 순서대로 실행하고, 커맨드 중 일부가 실패하면 다음 커맨드로 처리한다.

레디스 트랜잭션의 단점은 모든 커맨드가 큐에 쌓이기 때문에, 트랜잭션 내부에서 어떠한 결정도 내릴 수 없다는 점이다.

 

키 그룹에 낙관적 잠금(optimistic lock)을 구현한 WATCH 커맨드를 사용해 트랜잭션을 조건부로 실행할 수 있다.

WATCH 커맨드는 주시받는 키를 표시하고, 주시받는 키가 변경되지 않으면 EXEC 커맨드는 트랜잭션만 실행한다.

주시받는 키가 변경되면 null을 리턴하고 해당 커맨드를 다시 실행시켜야 한다.

'낙관적 잠금'이라고 지칭한 것이 바로 이런 이유 때문이다.

UNWATCH 커맨드는 주시 목록에 있는 키를 제거한다.

 

💚 파이프라인

레디스에서 파이프라인은 다중 커맨드를 레디스 서버에 한꺼번에 보내는 방법

개별 응답을 기다리지 않고 클라이언트에 의해 응답을 한 번에 읽을 수 있다.

레디스 클라이언트가 커맨드를 보내고 레디스 서버로부터 응답을 받는 데 걸리는 시간을 Round Trip Time(RTT)이라 한다.

다중 커맨드를 레디스로 보내면 다중 RTT가 존재한다.

 

파이프라인은 커맨드를 그룹화하기 때문에 RTT값을 줄일 수 있어, 열 개의 커맨드를 파이프라인으로 이용하면 하나의 RTT가 된다.

파이프라인은 레디스의 네트워크 성능을 확연히 개선할 수 있다.

 

파이프라인으로 전달된 레디스 커맨드는 독립적이어야 한다.

레디스 커맨드는 순차적으로 서버에서 실행되지만(순서는 보장됨), 틀내잭션 처리가 되지 않는다.

파이프라인이 전혀 트래잭션적이거나 원자적이지 않다고 해도(이것은 서로 다른 레디스 커맨드가 하나의 파이프라인에서 실행되는 것을 의미)

종종 부하가 높은 애플리케이션이 네트워크 병목 현상을 발생시키는데, 파이프라인은 네트워크 병목이 발생하지 않게 해 네트워크 시간을 많이 줄일 수 있기 때문에 유용하다.

 

많은 커맨드를 레디스 서버로 보낼 때, 하나의 큰 파이프라인을 쓰기보다는 여러 개의 파이프라인을 사용하는 것이 좋은 아이디어가 될 수 있다.

파이프라인은 레디스에서 새로운 아이디어 또는 독창적인 기능이나 커맨드가 아니다.

단지 파이프라인은 한 번에 많은 커맨드를 서버에 보낼 수 있는 기술일 뿐이다.

'TIL💡 > Database' 카테고리의 다른 글

[EF Core]Entity Framework core  (0) 2022.03.13
[Redis] 데이터 타입의 최적화  (0) 2022.02.27
[Redis] 데이터타입 실습2  (0) 2022.02.27
[Redis] Redis 학습 및 데이터 타입 실습1  (0) 2022.02.26
[SQL Server] Transaction  (0) 2022.02.12