Redis:如何检查while循环中是否存在

时间:2012-10-08 10:29:10

标签: node.js redis

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

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

但我想使用while循环;

while(exists == false)

但是我无法在脑海中构建代码结构。会不会在功能内或功能之外?

2 个答案:

答案 0 :(得分:1)

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

您应该使用以NX结尾的命令。例如 - SETNXHSETNX。这些只有在尚不存在的情况下才会插入密钥。它保证是原子的。

答案 1 :(得分: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