4.0.10をソースからビルドしてデフォルト設定時、GETコマンド実行時の動作をソースコードで確認します。以下、2つの段階に分けて処理が実行されます。main関数からaeMain関数までの処理aeMain関数までは、server.cでmain関数実行後、大きく以下の処理が実行される。パラメータ内容の読み込み後、Redisサーバの初期化を行う。ae.caeMain関数中のwhileで待機。break;Redisではリクエストの種類にINLINEとMULTIBULKの2種類があり、リクエスト内容が"*"で始まっていることからMULTIBULKが選択される。object.cRedisで文字列をembstrかrawのエンコーディングで保存するか、格納対象の文字列とパラメータ値に基づいて実行。object.c文字列をembstrのエンコーディングで作成していく。格納されていたが、"4\r\nhoge\r\n"が今は格納されている。object.csh->bufには"hoge"が格納された状態で値を返す。dict.cdictHashKey関数を実行すると、dictSdsCaseHash関数が呼ばれる。以下の値へのポインタが格納された状態で処理を続行。flagTransaction(c);クラスターモード有効時で、対象のキーが今いるノードにスロットが無い場合等にはリダイレクト処理。ここでは特に必要ないのでスキップ。関数を実行して、実際に入力されたコマンドの内容を処理。server.cc->cmd->proc(c)が実行される。proc関数は、redisCommandTable変数で各コマンドに対して定義している実行する関数が呼ばれる。db.clookupKeyRead関数を実行。networking.cMULTI_BULK形式でリプライを生成。server.ccall関数の処理続行。必要に応じてスローログの記録処理。statsの記録にも反映。}AOFやレプリケーションにも反映。server.ccall関数実行後、processCommand関数の処理に戻ってくる。handleClientsBlockedOnLists関数は実行せず、そのまま、C_OKを返す。networking.cprocessCommand関数実行後、processInputBuffer関数の処理に戻ってくる。ブロックされていない処理なので、resetClient関数を実行。その後、while文の最後まで達する。その後、processInputBuffer関数を抜け、readQueryFromClient関数を抜け、aeProcessEvents関数の処理に戻ってくる。aeProcessEventsRead処理実行後、Write処理等は特に無いため、そのまま処理継続。最後にタイマーイベントを確認。processTimeEvents関数実行後、aeProcessEvents関数の処理を終え、aeMain関数に戻ってくる。ae.caeMain関数に戻ってきた後、beforesleep関数が呼ばれる。Bufferに格納された結果をクライアントに返す。その後、再びaeMain関数のループ処理に戻ってきて、一連の処理は終了。aof.cAOFの設定は特にしてないので、ここでは特に何も処理を行わない。networking.cclientHasPendingReplies関数を実行。write関数実行後、クライアントには結果が返される。networking.cクライアントに返す結果があるのでtrueを返す。}事前準備Redisデバッグ用にビルドしておく。最適化は無効化しておく。デバッグで、コマンド実行ごとにprocessCommand関数を通過するので、コマンド実行の際の挙動をこちらを追うためにはこちらにブレークポイントを貼っておくと良い。コメントをキャンセルメールアドレスが公開されることはありません。mismith227.。