クライアントRedisのステップは、サーバーに接続します

ほとんどのクライアントとサーバが同じに接続され、サーバーへのRedis-CLI接続は、主に二つの段階、接続要求フェーズとデータ転送フェーズに分かれています。具体的にRedisの-CLIがあります:

図1に示すように、接続は、ソケットのようにして確立されます。

図2に示すように、適切なデータベースを選択します。

3、クライアントは、コマンドのエンコーディングを送信します。

図4に示すように、クライアントは、符号化データ(書き込み)を送信します。

図5に示すように、サーバ応答データ(読み取り)を受信し、

図6に示すように、受信したデータを解析します。

以下は、クライアントのソースコードを作ったものに応じて分析しました。

スタートコマンドはNO * /提供する/ *インタラクティブMODE
IF {(のargc == 0 && config.eval!)
/ * *フォース/にSIGPIPEインタラクティブモードに再接続を無視して
信号(SIGPIPE、SIG_IGN);

/ *になおWEは、接続エラー上のREPLを行うモードを中止するわけではありません。
*すべてのための新たな新たな試みが実行されます*コマンド/送信します。
cliConnect(0);
REPLを();
}
上記のコードは、対話モードの主な機能上のRedis-CLIセクションで、前者は、データ伝送のために責任があるサーバへの接続のために責任がある、請求REPLのcliConnect、から本質的になります。

接続の確立
、サーバへのクライアント接続には、我々は主要なステップが分割されていることを知って、

図1に示すように、ソケット(固定パターンを持っている)を作成します。

2.設定したIPとポート番号、サーバーConnet。

まあ、これは常に我々はそれがそれを行うのRedis方法を見て、伝統的なアプローチとなっていますか?

これは、最初の要求と応答データ情報とステータス情報を含む、コンテキスト構造Redisの定義は以下の通りであります:

{構造体redisContextのtypedef
; INT ERR
errstrはチャー[128];
int型FD;
フラグINT;
; * OBUFチャー
redisReader *リーダー;
列挙redisConnectionType CONNECTION_TYPE、
構造体体timeval *タイムアウト;
構造体{
CHAR *ホスト;
* SOURCE_ADDRをchar型、
ポートint型;
} TCP;

構造体{
チャー*経路;
} unix_sock;
} redisContext;
ERR、異常に可変errstrは定義がFD数sockfdデータを返すサーバのコマンドクライアント、リーダーコーディングOBUF、クライアントのために作成され、データを受信します。そして、初期化、定義されたTCP、FDやその他の情報cliConnectを実行します。

cliConnectの動作を見てみましょう

*サーバーに接続します。関数に特定のフラグを渡すことができます:
* CC_FORCE:接続がすでに存在していても実行される
*接続されたソケット。
* CC_QUIET:接続が失敗した場合、エラーを表示しません。* /
静的INT cliConnect(フラグINT){
IF(コンテキスト== NULL ||フラグ&CC_FORCE){
IF(!文脈= NULL){
redisFree(コンテキスト)。
}

IF(config.hostsocket == NULL){
コンテキスト= redisConnect(config.hostip、config.hostport)。
}他{
コンテキスト= redisConnectUnix(config.hostsocket)。
}
...

anetKeepAlive(NULL、、コンテキスト> FD、REDIS_CLI_KEEPALIVE_INTERVAL)。

/ * AUTHを行うと、右のDBを選択します。* /
IF(cliAuth()!= REDIS_OK)
; REDIS_ERRリターン
IF(cliSelect()= REDIS_OK!)
戻りREDIS_ERR;
}
戻りREDIS_OK;
}
接続が可能かどうかを、クライアントが、サーバに接続されていた場合に使用されるフラグ許可されている場合、0は接続、1がないことを示し接続(クライアント・サーバ・ログを変更する際に使用されます)。

redisConnectは、IP、ポートのコンテキストを定義し、redisContextInitコールの初期化文字列、ソケット接続を完了するためにredisContextConnectTcp(C、IP、ポート、NULL)を呼び出します。

接続が完了しているので、コマンドを呼び出すcliSelect

返信= redisCommand(文脈、 "SELECT 、config.dbnum%Dを");
データベース番号0(デフォルト)から選択されます。

データ伝送
入力ラインlinenoise処理ツールを用いて、REPLに()、文字列の一部を分割cliSplitArgsで、パラメータ処理部はissueCommandRepeatあります。これは、OBUコンテキストに渡さredisAppendCommandArgvエンコードパラメータを呼び出し、クライアントによって受信された復号データのcliReadReplyコール;(cliReadReplyに)下にあるI / Oデータを送信するための責任があるredisGetReplyを呼び出します。

INT redisGetReply(redisContextの*のC、ボイド**返信){
int型wdone = 0。
void *型の補助= NULL;

/ * * /保留中の応答を読み取ろう
(== REDIS_ERR redisGetReplyFromReader(C&AUX))であれば
、戻りREDIS_ERR。

/ *ブロックコンテキストのために、フラッシュの出力バッファおよび/ *応答を読み取る
(AUX == NULL && C->フラグ&REDIS_BLOCK)場合、{
/ *書き込み行われるまで* /
実行{
IF(redisBufferWrite(C、&wdone)== REDIS_ERR )
REDIS_ERRを返します。
}しばらく(wdone!)。

/ * READ応答があるまで* /
実行{
IF(redisBufferRead(C)== REDIS_ERR)
戻りREDIS_ERR。
(redisGetReplyFromReader(C&AUX)== REDIS_ERR)であれば
、戻りREDIS_ERR。
}一方(AUX == NULL);
}

/ * Setオブジェクト返信* /
; IF(!= NULL返信)AUXは*返信=
; REDIS_OKを返す
}
、それぞれ、主にredisBufferWriteとredisBufferRead I / OBUFにデータを読み書き。受信したデータを復号するための責任redisGetReplyFromReader。

概要:
1、基本的なクライアント・サイドのプログラミングに基づいてRedisの-CLIは、コンテキスト定義の増加は、あなたは、データをデータの善と悪の種類を知ることができます。

図2に示すように、符号化及び復号化機能の増加は、一般的なコーデック機能は、コーデックを行ったので、多分それは、データをより安全にすることができます。

3、またはいくつかの特定を達成するためには、さらなる研究が必要です。

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

おすすめ

転載: www.cnblogs.com/ly570/p/10961763.html