我是Redis和Node.JS的新手,并且一直试图将这两者结合使用。但是我对一个接一个地使用哪些功能感到有点困惑。
以下代码似乎同步运行,数据库的大小不断增加:
client.dbsize(function(err, numKeys) {
console.log("DB Size before hashes added" + numKeys);
return numKeys;
});
for (var i = 0; i < 100; i++) {
client.hmset(i, "username", "username", "answer", "answer");
client.zadd('answer', i, i);
};
client.dbsize(function(err, numKeys) {
console.log("DB Size after hashes added" + numKeys);
return numKeys;
});
然而,当我尝试查询排序集'answer'以返回一个数组时,这个数组'reply'不能立即用于回调'zrevrangebyscore'之外的其他redis函数。
client.zrevrangebyscore('answer', 100, 0, function(err, reply) {
console.log (reply);
return reply;
});
例如,在reply [1]上调用的后续'hgetall'函数返回undefined。我是否应该以异步方式使用所有Redis函数(包括hmset和dbsize)与callbacks / client.multi等,或者如果同步使用有效工作?感谢所有的帮助。
答案 0 :(得分:8)
Redis is single-threaded,所以 Redis上的命令总是按顺序执行 。看起来你可能正在使用Redis的异步客户端,这就是混乱的来源。由于您无法保证网络延迟,因此如果您使用的是异步Redis客户端,则稍后调用可能会在之前的调用之前访问Redis服务器并导致您遇到的问题。有一个非常好的解释,为什么Redis的异步客户端存在于here。
所有这些都说明了,在你的情况下,重要的一点是,如果你希望你的命令保证同步运行,你有几个选择:
答案 1 :(得分:0)
在同步和异步代码方面,你似乎很困惑。我建议尽可能多地阅读,然后点击&#34;。 我将举例说明出错的原因和原因:
//we're going to fake the redis dbSize function
var dbSize = function(callback){
//always finishes asynchronously
console.log("dbsize called");
setTimeout(callback, 1000);
};
//here we get to your code
dbSize(function(){
console.log("First callback");
});
console.log("synchronous redis method calls");
//here come the synchronous redis methods, that finish synchronously
dbSize(function(){
console.log("Second callback");
});
现在,如果您run this code,它会将以下内容输出到控制台:
"dbsize called"
"synchronous redis method calls"
"dbsize called"
"First callback"
"Second callback"
正如您所看到的,调用同步方法,之前异步方法已完成。所以,所有这一切都是为了确保你之后调用同步方法 ,这将是第一次回调,即你必须将这些东西链接在一起。 现在这很麻烦,因为它引导你回调地狱:
dbSize(function(){
console.log("First callback");
console.log("synchronous redis method calls");
//here come the synchronous redis methods, that finish synchronously
dbSize(function(){
console.log("Second callback");
});
})
所以,为了避免使用像async lib
这样的东西最好async.series([
function(next){
dbSize(next);
},
function(next){
console.log("synchronous redis method calls");
//here come the synchronous redis methods, that finish synchronously
next();
},
function(next){
dbSize(next);
},
], function(){
console.log('All done!');
})
这将输出:
"dbsize called"
"synchronous redis method calls"
"dbsize called"
"All done!"