Computer >> 컴퓨터 >  >> 프로그램 작성 >> Redis

Redis 프로토콜에 대한 초보자 가이드

Redis의 가장 알려지지 않은 기능 중 하나는 유선 프로토콜입니다. 이것이 Redis가 고품질 클라이언트 라이브러리의 가장 큰 생태계 중 하나인 이유입니다. Redis 유선 프로토콜은 매우 간단하여 Redis의 모든 주요 기능을 구현하는 클라이언트를 쉽게 구축할 수 있습니다. 또한 빠르고 효율적인 클라이언트 라이브러리를 쉽게 작성할 수 있도록 설계되었습니다.

RESP란 무엇입니까?

RESP(RE dis S 직렬화 P rotocol)은 Redis 클라이언트와 서버가 TCP를 통해 서로 통신하는 데 사용하는 텍스트 기반 프로토콜의 이름입니다. 서버와 클라이언트 간의 모든 통신은 5가지 기본 유형으로 구성됩니다.

  • 단순 문자열 "OK"(성공적인 쓰기 명령 후) 또는 "PONG"(PING 명령에 대한 성공적인 응답)과 같은 일반적인 서버 응답에 사용됩니다.
  • 대량 문자열 GET, LPOP 및 HGET과 같은 거의 모든 단일 값 읽기 명령에 대해 반환됩니다. 대량 문자열은 이스케이프되거나 인코딩되지 않고 줄 바꿈, 제어 문자, validRESP 등 무엇이든 포함할 수 있다는 점에서 단순 문자열과 다릅니다.
  • 정수 STRLEN, HLEN 또는 BITCOUNT와 같은 모든 종류의 계산 명령에 대한 응답으로 사용됩니다.
  • 배열 다른 배열을 포함하여 RESP 개체를 원하는 수만큼 포함할 수 있습니다. 이것은 HGETALL, LRANGE 또는 MGET과 같이 둘 이상의 요소를 반환하는 응답뿐만 아니라 서버에 명령을 보내는 데 사용됩니다.
  • 오류 잘못된 유형의 데이터를 보유한 키에 대해 명령을 실행하려고 할 때와 같이 명령을 처리하는 동안 Redis에 오류가 발생할 때마다 반환됩니다.

RESP를 쓰고 읽을 때 키나 값을 이스케이프하거나 인코딩할 필요가 없습니다. 실제로 구문 분석해야 하는 RESP의 유일한 부분은 각 RESP 개체에 포함된 간단한 메타데이터입니다.

RESP는 어떻게 생겼나요?

모든 RESP 객체는 접두사 문자로 시작하고 줄 종결자로 끝납니다(자체 줄 종결자를 포함하지 않는 배열 제외). RESP 개체의 가장 간단한 예는 OK입니다. 간단한 문자열 응답:

+OK\r\n

(RESP는 사람이 읽을 수 있는 프로토콜이지만 명확성을 위해 명시적으로 줄 바꿈(\r\n ) 모든 RESP 예에서.)

위의 간단한 문자열에서 + 단순 문자열 접두사, OK 단순 문자열의 본문이며 \r\n 이 간단한 문자열의 끝을 표시하는 줄 종결자입니다.

간단한 문자열을 읽으려면 다음 \r\n까지 읽습니다. lineterminator, 이전 바이트 반환(최대 + ) 반환된 응답 문자열로. 이것은 RESP 단순 문자열이 개행 문자를 포함할 수 없기 때문에 작동합니다.

오류 및 정수 형식은 단순 문자열과 유사하지만 다른 접두사를 사용합니다. 오류에는 - 접두사가 붙습니다. :

-ERR unknown command 'GETT'\r\n

그리고 정수에는 : 접두사가 붙습니다. :

:99\r\n

대량 문자열은 두 부분이 있다는 점에서 고유합니다. 길이 사양 및 본체:

$13\r\nHello, World!\r\n

$ 대량 문자열 접두사, 13 실제 stringbody의 바이트 수이고 \r\n입니다. 길이 지정을 종료합니다. Hello, World! 13바이트 문자열 본문이며 \r\n로도 종료됩니다. (문자열 본문의 일부가 아님).

벌크 문자열 컨테이너는 본문의 정확한 길이를 제공하기 때문에 끝을 찾기 위해 실제 문자열 본문을 구문 분석해야 합니다. 문자열의 내용을 검사하지 않고 소켓에서 또 다른 13바이트(마지막 줄 종결자 포함)를 읽을 수 있습니다. 즉, 내용을 인코딩하거나 이스케이프하지 않고 문자열 본문에서 원하는 모든 데이터를 사용할 수 있습니다.

배열은 길이 지정으로 시작하지만 길이 필드는 배열 내용의 바이트 수가 아니라 배열의 개체 수를 나타냅니다.

*2\r\n$3\r\nfoo\r\n$3\r\nbar\r\n

위의 예에는 두 개의 대량 문자열(foobar ). 배열 길이 사양은 대량 문자열을 읽을 때 건너뛸 수 없지만 클라이언트에서 배열을 쉽게 구현할 수 있도록 합니다. 우리는 배열 크기를 읽고 더 많은 객체를 읽은 다음 최종 배열에 있는 모든 객체를 반환합니다.

모든 Redis 명령은 대량 문자열 배열로 전송됩니다. 예를 들어 "SET mykey 'my value'" 명령은 다음과 같이 작성되어 전송됩니다.

*3\r\n$3\r\nSET\r\n$5\r\nmykey\r\n$8\r\nmy value\r\n

추가 RESP 세부정보

RESP에서 사용되는 접두어 길이를 사용하면 복잡한 상태 모델링을 수행하거나 데이터를 여러 번 통과할 필요 없이 구문 분석기를 구현하여 매우 빠른 구문 분석기를 구축할 수 있습니다.

null 벌크 문자열 및 null 배열과 같이 여기에서 다루지 않은 많은 세부 사항이 있습니다. 자세한 내용은 공식 문서(평소와 같이)에 RESP에 대한 매우 읽기 쉽고 포괄적인 문서 페이지가 있습니다.

프로토콜을 더 잘 이해하는 가장 좋은 방법은 simpleclient를 직접 구현하는 것입니다. 다음 Go에서 Redis 프로토콜 읽기 및 쓰기에 대한 가이드를 확인하세요.