我在我的应用程序中使用Redis,有一件事对我来说并不清楚。我用一个随机生成的字符串保存一个对象作为其键。但是,我想检查该密钥是否存在。我打算使用while循环但是我不确定如何根据Redis构造它。因为如果我想检查一次,我会这样做;
redisClient.get("xPQ", function(err,result){
if(result==null)
exists = false
});
但我想使用while循环;
while(exists == false)
但是我无法在脑海中构建代码结构。会不会在功能内或功能之外?
答案 0 :(得分:1)
通常,您不应检查客户端是否存在密钥。它导致竞争条件。例如,另一个线程可以在第一个线程检查其存在后插入密钥。
您应该使用以NX结尾的命令。例如 - SETNX和HSETNX。这些只有在尚不存在的情况下才会插入密钥。它保证是原子的。
答案 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函数。