0

1 か月間ブロックされていた問題を解決しようとしています

私はNode.js と Redisを使用してアプリケーションのバックエンドを構築しています。構造上、ある redis テーブルから別の redis テーブルにデータを転送する必要があります (テーブルとは、「select」、つまり「select 2」を使用するテーブルのことです) )

大量のリクエストを受け取り、1 秒間に大量のレスポンスをプッシュし、いくら試してもデータが混ざり合うのを止めることができませんでしたRedis テーブル #2内に格納する必要がある"teacherID"があるとします。そして、Redis テーブル #4に格納する必要がある「studentID」。何を試しても(コードを何度もチェックしました)、teacherID が studentID に入るのを止めることができませんでした。私が試した最後のトリックは、実際に各選択時にコールバックを配置することでした。;

redisClient.select(4, function(err) {
  if(err)
    console.log("You could not select the table. Function will be aborted");
  else {
    // Proceed with the logic
  }
});

この混乱を簡単に止めることができない理由は何でしょうか? 私を夢中にさせる1つの詳細は、ローカルでもオンラインでも非常にうまく機能することですが、複数のリクエストがサーバーに到達するたびに混合されます. このエラーを防ぐための提案はありますか? (NDA にコードを共有することはできませんが、ロジックが正しくコーディングされていることを確認できます)

4

1 に答える 1

1

「あるredisテーブルから別のredisテーブルにデータを転送する」必要があるというあなたの声明についてはよくわかりません。あなたの例を読むと、異なるデータベース(「テーブル」と呼ばれるもの)に書き込む2つのredisクライアントを単純に持つことができるようです。

これは次のようになります。

var redis = require("redis");
var client1 = redis.createClient(6379, '127.0.0.1');
var client2 = redis.createClient(6379, '127.0.0.1');

client1.select(2, function(err){
    console.log('client 1 is using database 2');
});

client2.select(4, function(err){
    console.log('client 2 is using database 4');
});

次に、読み取り/書き込みロジックがどこにあっても、適切なクライアントを使用するだけです。

client1.set("someKey", "teacherID", function(err){
    // ...
});

client2.set("someKey", "studentID", function(err){
    // ...
});

上記をコールバックを使用して関数にカプセル化し、操作をネストし、非同期ライブラリを使用するなどして、必要なことを何でも実行できるようにすることは明らかです。データベース 2 からデータベース 4 に値を転送する必要がある場合は、単純なclient1.get()andを実行できますclient2.set()

于 2012-12-08T14:49:44.300 に答える