2012-10-08 90 views
1

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

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

但我想使用while循环作为;

while(exists == false) 

但是我不能在我的脑海中构建代码结构。请问功能或功能外?

回答

1

一般情况下,你不应该检查客户端上的一个键的存在。它导致竞争条件。例如,另一个线程可以在第一个线程检查其存在之后插入密钥。

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

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

+0

在对该密钥插入值之前,OP正在检查密钥的存在。你提出的方法会导致这种情况下的竞争条件,对吧? –

+0

可能是的。有很多更好的方法来解决这个问题。我只是想展示如何在异步上下文中实现循环。 –

相关问题