넓고 얕은 데이터베이스 지식/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