1

我在我的应用程序中使用 Redis,但我不清楚一件事。我保存一个随机生成的字符串作为其键的对象。但是我想检查该密钥是否存在。我打算使用 while 循环,但是我不确定如何根据 Redis 来构造它。因为如果我想检查一次,我会做;

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

但我想将while循环用作;

while(exists == false)

但是我无法在脑海中构建代码结构。while 是在函数内部还是函数外部?

4

2 回答 2

2

通常,您不应该检查客户端是否存在密钥。它会导致竞争条件。例如,另一个线程可以在第一个线程检查它的存在之后插入密钥。

您应该使用以 NX 结尾的命令。例如 - SETNXHSETNX。这些将仅在不存在时插入密钥。它保证是原子的。

于 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 回答