3

セッションストアにconnect-redisを使用しましたが、を使用するreq.sessionと、すべての操作が同期されているように見えます。これは、通常のJavascript変数を操作するのと同じで、コードは順序に従います。しかし、非同期方式を使用しているソースコードをチェックしているので、なぜそのreq.sessionように動作するのだろうか。

もう1つの質問は、複数のredisクエリがある場合、

client.sadd('test', 1);
client.del('test');
client.sadd('test', 2);
client.sadd('test', 3);

デル操作をどこに置いても、結果は常に同じです。これらのクエリは任意の順序で実行される可能性があると思いましたか?それらはすべて非同期で呼び出されるため、期待した結果は毎回異なるはずです。

助けてくれてありがとう

4

1 に答える 1

2

Redis サーバーへのラウンドトリップが非同期で管理されるという事実は、クエリがランダムな順序で送信されるという意味ではありません。

Redis (およびほとんどの Redis クライアント ライブラリ) は、通常、ラウンドトリップ数を最適化するために使用されるパイプライン処理をサポートしています。アイデアは、複数のクエリを送信してから、応答を待つことです。クエリと応答を一致させるためにクライアントが使用するため、順序は重要です。

Node.js は、この種のメカニズムをサポートするのに非常に適しています。Matt Ranney のnode_redisクライアントは、透過的な方法でパイプライン処理をサポートしています。同じクライアント オブジェクトが使用されている場合、すべてのクエリはシリアル化され、順番に実行されます。

あなたの例では、クエリが常に同じ順序で実行されるのは正常です。この点は、monitorコマンドを使用して Redis に送信されたクエリの流れを表示することで確認できます。

ここで、パイプラインの最後のクエリがコールバックに関連付けられていることが重要です。そうしないと、プログラムは最後のクエリがいつ完了したかを知ることができません。

于 2012-12-27T19:20:45.783 に答える