넓고 얕은 데이터베이스 지식/NoSQL

Redis의 RESP에 대해 간단히 알아보자

팡펑퐁 2025. 5. 21. 01:42
728x90

🤖 RESP(Redis Serialization Protocol)란?

  • Redis 서버는 클라이언트와 통신할 때 RESP(Redis Serialization Protocol)라는 간단한 텍스트 기반 프로토콜을 사용한다.
  • 일반적인 서버와 클라이언트가 JSON 형식으로 데이터를 주고받는 것처럼 클라이언트가 명령을 보낼 때와 Redis 서버가 응답할 때 모두 정해진 포맷으로 문자열을 주고받는 방식이다.

 

😗 간단한 예시

# 클라이언트
$ set email gildong@email.email
  • 클라이언트에서 사용자가 입력하는 명령어이다.

 

# RESP로 변환되어 서버에는 아래와 같이 전송됨
*3\r\n$3\r\nSET\r\n$5\r\nname\r\n$19\r\ngildong@email.email\r\n
  • Redis 서버로 전송될 때 변환되는 형식이다.

 

✍🏻 설명

내용 의미
*3 총 3개의 파트(SET, name, Alice)
$3 SET 첫 번째 파트는 길이 3인 문자열 SET
$5 name 두 번째 파트는 길이 5인 문자열 name
$19 gildong@email.email 세 번째 파트는 길이 19인 문자열 gildong@email.email

 

🥸 실습

# redis가 실행중인 로컬에서(redis cli 아님X)
$ echo -e '*3\r\n$3\r\nSET\r\n$5\r\nemail\r\n$19\r\ngildong@email.email\r\n' | nc localhost 6379

# 출력
+OK

# 그대로 로컬에서
$ echo -e "*2\r\n$3\r\nGET\r\n$5\r\nemail\r\n" | nc localhost 6379

# 출력
$19
gildong@email.email

echo 및 nc 명령어를 이용해 프로토콜 그대로 redis서버에 명령을 보내면 클라이언트에서 입력한 명령어와 똑같이 동작한다.

 

  • echo -e: 문자열 내의 이스케이프 문자(\r\n 등)를 실제로 해석해서 출력한다.
  • | nc localhost 6379: 위에서 만든 명령을 Netcat을 통해 로컬에서 실행 중인 Redis 서버에 TCP로 전송한다.
    • | : 앞에서 생성한 문자열을 파이프로 넘김.
    • nc : netcat 명령어로, TCP/UDP 연결을 만들어 네트워크 통신을 할 수 있게 해주는 도구.
    • localhost 6379 : 로컬에 설치된 Redis 서버의 기본 포트(6379)로 연결.

 

 

☝🏻 RESP v2

  • Redis 6 버전 이전에서 기본으로 사용되던 텍스트 기반 프로토콜이다.
  • 위의 예시가 RESP v2 버전이다.
  • 간단하고 빠르지만 제한적인 구조를 가진다.

 

✌🏻 RESP v3

  • Redis 6부터 도입된 향상된 프로토콜이다.
  • 더 풍부하고 표현력 있는 구조를 제공한다.
  • HELLO 3 명령어로 동작할 수 있다.
  • JSON과 유사한 구조가 필요한 경우나 map, set, null 등을 명확히 다루고 싶을 때 사용한다.

 

👀 예시

 

✅ 기본 구조 요약 정리

타입명 RESP2 구분자 RESP3 구분자 설명
Simple String + + 일반 문자열 응답 (예: +OK)
Error - - 에러 메시지 (예: -ERR something)
Integer : : 숫자 응답 (예: :100)
Bulk String $ $ 길이 명시된 문자열 (예: $5\r\nhello)
Null $-1 _ RESP2는 null bulk string, RESP3는 _
Array * * 일반 배열
Null Array *-1 ~0 RESP2는 null array, RESP3는 빈 set/array 등으로 구분
Boolean # RESP2는 없음, RESP3는 #t(true), #f(false)
Map % Key-Value 쌍 구조
Set ~ 중복 없는 값들의 집합
Push message > Pub/Sub, client tracking 등 서버 푸시 메시지
Double , 부동 소수점 숫자 (예: ,3.14)
Big number ( 큰 정수 (BigInteger 등)
Verbatim String = 형식을 포함한 문자열 (예: =txt:Hello)

 

 

 

참고

2025 오픈소스 컨트리뷰션 아카데미 Git & Redis 수업 자료

ChatGPT

728x90