클라이언트 레디 스 단계는 서버에 연결

대부분의 클라이언트와 서버는 주로 두 단계, 상기 접속 요청의 위상과 데이터 전송 페이즈로 분할 서버 같은, 레디 스-CLI 연결에 접속된다. 특히 레디 스-CLI는 않습니다 :

도 1에서, 연결 소켓 방식으로 설정된다;

2, 적절한 데이터베이스를 선택;

도 3은, 클라이언트가 명령 엔코딩을 보낸다;

도 4는 클라이언트가 부호화 된 데이터 (기록)를 송신;

도 5에서, 서버는 응답 데이터 (읽기) 부;

(6) 상기 수신 된 데이터를 분석.

다음은 클라이언트의 소스 코드를 만들 었는지에 따라 분석 하였다.

시작 명령이 NO * / 제공 / * 인터랙티브 MODE
IF {(는 argc == 0 && config.eval를!)
에 / * A * 력 SIGPIPE 인터랙티브 MODE 다시 연결 무시 /에
신호 (SIGPIPE, SIG_IGN);

/ *에 해당 참고 우리는 연결 오류에 REPL을 모드를 중단하지 않습니다.
* 모든위한 새로운 새로운 시도가 수행됩니다 * 명령 / 전송합니다.
cliConnect (0);
REPL을 ();
}
위의 코드는 대화 형 모드의 주요 기능에 대한 레디 스 - CLI 섹션, 본질적으로, 전자는 데이터 전송을 담당하는 서버에 접속을 담당 상기 REPL의 cliConnect의 이루어져있다.

연결 수립
서버에 클라이언트 연결에를, 우리는 주요 단계가 나누어 알고,

1 소켓 (고정 패턴을 가지고)를 만들고;

2. 설정된 IP 주소 및 포트 번호, 서버어요 Connet;

음,이 항상 전통적인 접근하고있다, 우리는 그것을 할 레디 스 방법에 대해 알아?

먼저 요청하고 다음과 같이 응답 데이터 정보 및 상태 정보가 포함 컨텍스트 구조 레디 스 정의 :

타입 정의 구조체 redisContext {
INT의 ERR;
errstr을이 숯불 [128]
INT FD,
플래그를 나타내는 int
CHAR * OBUF;
redisReader * 리더;
열거 redisConnectionType의 connection_type;
timeval 구조체 * 초과;
구조체 {
CHAR * 호스트;
숯 *의 SOURCE_ADDR;
포트에서 INT;
} TCP;

구조체 {
숯 * 경로;
} unix_sock;
} redisContext,
ERR, 이상에서 변수 errstr을 정의 FD sockfd와 데이터를 리턴하도록 서버의 명령 클라이언트 리더 코딩 obuf 클라이언트에 대해 생성 된 데이터를 수신한다. 그리고 초기화, 정의 TCP, FD 및 기타 정보 cliConnect을 수행합니다.

cliConnect의 동작을 살펴 보자

* 서버에 연결합니다. 이 함수에 특정 플래그를 통과 할 수있다 :
* CC_FORCE : 연결이 이미 존재하는 경우에도 수행
* 연결된 소켓.
* CC_QUIET : 연결이 실패 할 경우 오류를 인쇄하지 마십시오. * /
정적 INT cliConnect (INT 플래그) {
경우 (상황 == NULL || 플래그 및 CC_FORCE) {
경우 (상황 = NULL!) {
redisFree (컨텍스트);
}

경우 (config.hostsocket == NULL) {
문맥 = redisConnect (config.hostip, config.hostport);
사용한다} else {
문맥 = redisConnectUnix (config.hostsocket);
}
...

anetKeepAlive (NULL, 상황에> FD, REDIS_CLI_KEEPALIVE_INTERVAL);

/ * AUTH를 수행하고 오른쪽 DB를 선택합니다. * /
경우 (cliAuth ()! = REDIS_OK)
REDIS_ERR 복귀;
(! cliSelect () = REDIS_OK) IF
복귀 REDIS_ERR는;
}
; REDIS_OK를 반환
}
허용되는 경우, 클라이언트는 접속 수, 0은 연결 1 나타냄 여부, 서버에 연결되어있는 경우에 사용되는 플래그 연결 (클라이언트 서버 로그를 변경할 때 사용됩니다).

redisConnect의 IP, 포트의 컨텍스트 정의한다 redisContextInit 호출 초기화 문자열을 소켓 연결을 완료 할 redisContextConnectTcp (C, IP, 포트, NULL)로 전화하십시오.

연결이 완료 되었기 때문에, 명령을 호출 cliSelect

redisCommand (콘텍스트 "를 선택 = 올리 ], config.dbnum %의 D")
베이스 번호 0 (디폴트) 행을 선택한다.

데이터 전송
처리 툴 linenoise 입력 라인을 사용하여 REPL ()에서이 문자열 부분 cliSplitArgs 나뉘어져 파라미터 처리부는 issueCommandRepeat이다. (cliReadReply)에 redisGetReply 전화 기본 I / O 데이터 전송을 담당; cliReadReply 데이터 호출이 클라이언트에 의해 수신 된 디코딩하는 단계; 이것은 OBU 컨텍스트 전달 redisAppendCommandArgv 인코딩 파라미터를 호출한다.

INT redisGetReply (redisContext의 * C를 무효 응답 **) {
INT wdone = 0;
보이드의 AUX * = NULL;

/ * * / 응답 보류 읽으려고
(==) REDIS_ERR redisGetReplyFromReader (c, AUX) 경우
리턴 REDIS_ERR 단계;

/ * 차단 컨텍스트 플러시 출력 버퍼 및 판독 응답 * / 용
경우 (AUX == NULL && C-> 플래그 및 REDIS_BLOCK) {
/ * 쓰기 수행 * /까지
수행 {
경우 (redisBufferWrite (c, wdone) == REDIS_ERR )
REDIS_ERR를 반환;
} 동안 (wdone!)

/ * 읽기 응답이있을 때까지 * /
할 {
경우 (redisBufferRead (C) == REDIS_ERR)
반환 REDIS_ERR;
(redisGetReplyFromReader (c, AUX) == REDIS_ERR) 경우
리턴 REDIS_ERR;
} 동안 (AUX == NULL);
}

/ * 설정 개체 답글 * /
IF (= NULL 대답!이) = AUX 답글 *;
; REDIS_OK 반환
}
/를 I로 각각 주로 redisBufferWrite 및 redisBufferRead를 작성하고 데이터를 읽을 Obuf. 수신 된 데이터를 디코딩하기위한 책임 redisGetReplyFromReader.

요약 :
1, 기본 클라이언트 측 프로그래밍의 기초 레디 스-CLI는, 컨텍스트 정의의 증가, 당신은, 데이터를 데이터의 좋고 나쁜 유형을 알 수 있습니다.

제 2 인코딩 및 디코딩 기능의 증가는, 일반적으로 기능 코덱은 코덱을 실시했기 때문에 아마 인, 데이터가 더 안전 할 수있다.

3, 또는 어떤 특정는 더 많은 연구가 필요 달성했다.

 
--------------------- 

추천

출처www.cnblogs.com/ly570/p/10961763.html