RESP (REdis Serialization Protocol) 알아보기
Redis는 이름부터가 Remote Dictionary Server, "원격 Key-Value 저장소"다
즉, 캐싱을 사용하려고 하는 클라이언트 서버와 물리적으로 떨어져 있는 상황에서의 운영을 전제로 두고 있다
그럼 Redis 서버와 클라이언트 서버는 어떻게 정보를 주고받을까? Redis는 통신 하면 바로 떠오르는 HTTP 프로토콜을 사용하지 않는다
RESP (Redis Serialization Protocol)
Redis는 HTTP 대신 RESP라는 자체 프로토콜을 사용한다
- 5가지 기본 타입:
*- Array, 배열$- Bulk String, 문자열 (반드시 length prefix가 필요!):- Integer, 정수형+- Simple String, 짧은 문자열 (length prefix가 없음)-- Error, 에러
\r\n을 구분자로 사용
RESP 2 기준으로는 이게 끝이다. 즉, 모든 응답은 문자열 또는 정수형 또는 배열 인 셈이다
RESP 3
RESP 2는 빠르고 단순하지만, 사실상 타입이 세개 뿐이었기 때문에 표현력에 한계가 있었다
그래서 클라이언트가 타입을 다시 해석해야 한다는 문제점을 해결하기 위해, Redis 6.0부터는 다양한 타입을 추가로 지원하는 RESP 3 프로토콜을 지원하기 시작했다
_- Null (_\r\n)#- Boolean, 불리언 (#t\r\n또는#f\r\n),- Double, 부동소수점 실수(- Big Number, 큰 정수!- Bulk Error, length prefix를 가지는 에러 문자열- ...
Redis 6.0 이상을 사용한다 하더라도 하위 호환성을 위해 커넥션에서는 기본적으로 RESP 2를 사용하기 때문에, RESP 3 프로토콜을 사용하기 위해서는 HELLO 3 명령을 통해 각각의 커넥션마다 직접 업그레이드를 해줘야 한다!
실습
telnet을 활용하면 RESP 프로토콜의 동작을 직접 살펴볼 수 있다
SET, GET
RESP에서 GET tmp 명령은 *2\r\n$3\r\nGET\r\n$3\r\ntmp\r\n 처럼 전송된다. "길이가 2인 Array인데 첫번째 Bulk String은 GET, 두번째 Bulk String은 tmp"라는 뜻이다

이렇게 RESP 프로토콜을 통해 Redis(Valkey) 서버에 요청을 보내면

GET tmp 에 대한 응답으로 hi가 오는걸 볼 수 있다
(미리 SET tmp hi 를 실행해둠)

여기서 SET tmp changed 명령을 통해 tmp라는 key에 대한 value를 변경하면


아까랑 똑같은 GET tmp에 대한 응답으로 이번에는 changed가 오는것을 확인해볼 수 있다
ZADD, ZRANGE
Redis에서는 Sorted Set이라는 자료구조를 제공하는데, 이름 그대로 정렬된 집합이다
일반적인 Set처럼 중복 원소를 허용하지 않을 뿐 아니라, 원소마다 가지는 score 실수값을 통해 원소들을 자동으로 정렬해서 보관해둔다 (원소 자체는 중복될 수 없지만 score는 중복될 수 있다! 이때 같은 score를 가지는 원소들끼리는 사전순으로 정렬된다)
덕분에 상위 n개 조회, 특정 score 범위 조회 같은 명령을 굉장히 빠르게 수행할 수 있다

ZADD {set이름} {score} {elem} 구조로 데이터를 하나씩 넣을 수도 있고, ZADD {set이름} {score1} {elem1} {score2} {elem2} ... 처럼 한번에 여러 개의 데이터를 넣을 수도 있다
ZRANGE {set이름} {startIdx} {endIdx} 명령을 통해 정렬된 원소들 중 원하는 수 만큼의 원소들을 조회할 수 있다


이때 endIdx에 -1을 넣으면 모든 원소를 조회한다


기본적인 정렬 순서는 score의 오름차순이기 때문에 점수가 낮은 원소가 앞쪽 인덱스로 정렬되어 있는데, 조회 순서를 뒤집으려면 뒤에 optional 파라미터인 REV를 추가해주면 된다
또, score를 같이 보고싶을 경우 마찬가지로 optional 파라미터인 WITHSCORES를 추가해주면 된다

