1

私は自分のアプリケーションで Redis を使用していますが、明確でないことが 1 つあります。ランダムに生成された文字列をキーとしてオブジェクトを保存します。ただし、そのキーが存在するかどうかを確認したいと思います。while ループを使用する予定ですが、Redis に従ってどのように構造化すればよいかわかりません。一度確認したい場合は、そうします。

redisClient.get("xPQ", function(err,result){
   if(result==null)
      exists = false
});

しかし、while ループを次のように使用したいと思います。

while(exists == false)

しかし、頭の中でコード構造を構築することはできません。while は関数内にありますか、それとも関数外ですか?

4

2 に答える 2

2

一般に、クライアント側でキーの存在を確認するべきではありません。それは競合状態につながります。たとえば、最初のスレッドがキーの存在を確認した後で、別のスレッドがキーを挿入する可能性があります。

NX で終わるコマンドを使用する必要があります。例 - SETNXおよびHSETNX。これらは、まだ存在しない場合にのみキーを挿入します。アトミックであることが保証されています。

于 2012-10-08T12:19:14.217 に答える
0

キーが存在するかどうかを確認するためにアクティブ ポーリングを実装する必要がある理由がわかりません (この種の状況を処理するためのより良い方法があります) が、質問に答えようとします。

while ループは (関数の内外で) まったく使用しないでください。node.js の非同期性のため、これらのループは末尾再帰を使用して実装する方が適切です。以下に例を示します。

var redis = require('redis')
var rc = redis.createClient(6379, 'localhost');

function wait_for_key( key, callback ) {
   rc.get( key, function(err,result) {
      if ( result == null ) {
         console.log( "waiting ..." )
         setTimeout( function() {
            wait_for_key(key,callback);
         }, 100 );
      } else {
         callback(key,result);
      }
   });
}

wait_for_key( "xPQ", function(key,value) {
   console.log( key+" exists and its value is: "+value )
});

専用ライブラリを使用してこれらの式を単純化する方法は複数あります (継続渡しスタイルまたはファイバーを使用)。たとえば、async.js パッケージの while 関数と until 関数を確認したい場合があります。

https://github.com/caolan/async

于 2012-10-08T11:41:42.533 に答える