舞台裏では、SE.Redisはパケットの断片化を回避するためにかなりの作業を行っているため、あなたの場合と非常によく似ていることは驚くことではありません。バッチ処理とフラットパイプラインの主な違いは次のとおりです。
- バッチが同じマルチプレクサで競合する操作とインターリーブされることはありません(ただし、サーバーでインターリーブされる場合があります。
multi
を使用する必要がないようにするためです。 /exec
トランザクションまたはLuaスクリプト) - バッチはすべてのデータを事前に知っているため、サイズが小さいパケットの可能性を常に回避します
- ただし、同時に、何かを送信する前にバッチ全体を完了する必要があるため、メモリ内のバッファリングがさらに必要になり、人為的にレイテンシが発生する可能性があります
ほとんどの場合、SE.Redisは自動的に実行することのほとんどを実行するため、バッチ処理を回避することでより良い結果が得られます。 単に仕事を追加するとき。
最後に、ローカルオーバーヘッドを回避したい場合、最後のアプローチの1つは次のとおりです。
redisDB.SetAdd(string.Format(keyFormat, row.Field<int>("Id")),
row.Field<int>("Value"), flags: CommandFlags.FireAndForget);
これにより、応答を待機したり、不完全なTask
を割り当てたりすることなく、すべてがネットワークに送信されます。 s将来の値を表します。 Ping
のようなことをしたいかもしれません 最後になし ファイアアンドフォーゲット、サーバーがまだあなたと話していることを確認します。ファイアアンドフォーゲットを使用すると、報告されるサーバーエラーに気付かないことに注意してください。