1

redisのrdbデータファイルをダンプするツールを書いています。'sync'コマンドを送信してスレーブとして保存します。次に、rdbをkeys、valuesに解析します。ただし、ネットワークから直接読み取った場合、rdbを解析できません。ネットワークデータをファイルに書き込み、代わりにファイルをペアリングするとうまく機能します。どうしてか分かりません 。コードはネットワークを解析し、ファイルは完全に同じです。ネットワークの解析とファイルの解析に違いはありますか?

ありがとう !

----------------更新------------------
問題は解決しました:
それは私のせいです、私はネットワークプログラミングに精通していません。読み取りシステムコールを間違った方法で使用しました。
例:
ネットワークからSIZEバイトを読み取りたい、と書いた:
nread = read(fd,buf,SIZE)
nreadがSIZEに等しいと仮定した。これは、ほとんどの場合ファイルの読み取りには適していますが、ほとんどの場合ネットストリームの読み取りには機能しません。そのため、代わりにredisreplication.cでsyncReadを使用します。
私が問題を解決するのを手伝ってくれてありがとう!

4

1 に答える 1

3

ネットワーク ストリームの解析とファイルの解析に違いはありません。具体的には、redis ダンプ ファイルを解析する場合、前方または後方にシークする必要はありません。読み取る必要がある正確なバイト数が事前にわかっているため、適切な量のメモリを割り当てることができます。

sync コマンドを介してスレーブとして接続する際の問題の 1 つ - Redis サーバーは接続を閉じません。rdb ファイルが転送されるとすぐに、通常の redis プロトコルを介して増分コマンドの送信を開始します。この遷移を検出できない場合は、解析エラーが発生します。

それでもネットワーク ストリームを解析できない場合は、何らかのコードを提供するか、いくつかの例外/スタック トレースを貼り付ける必要があります。

そうは言っても、ダンプファイルをディスクに書き込んでから解析するのが最善だと思います。これが現在の redis スレーブの動作方法です。

余談:

私は、redis ダンプ ファイル用の Python ベースのパーサーであるredis-rdb-tools の作成者です。ダンプ ファイルの形式を文書化し、別の言語でパーサーを作成する方法に関する FAQ エントリを用意しました。これらのリンクが役立つ場合があります。

于 2012-04-26T11:58:21.890 に答える