我在node.js中使用redis客户端
var db = require("redis");
var dbclient = db.createClient();
我以下一种方式加载数据库:
dbclient.zrange("cache", -1000000000000000, +1000000000000000, function(err, replies){
logger.info("Go to cache");
for (var i=0; i < replies.length; i++){
(function(i){
// Do some commands with the result
})(i)
}
})
我注意到我的应用程序启动时需要30秒。用于执行数据库查询。在这段时间内,Express
模块没有提供任何其他请求。
我该如何解决这个问题?为什么没有异步?
答案 0 :(得分:3)
如果您担心正常运行时间,那么您应该使用ZSCAN
使用COUNT选项获取每次通话的更多数据,但请记住:
虽然SCAN不保证每次迭代返回的元素数量,但可以使用COUNT选项凭经验调整SCAN的行为
在每个结果中使用setImmediate函数迭代到下一个SCAN。
var cursor = '0';
function doscan(){
dbclient.zscan("cache", cursor, "COUNT", "100", function(err, replies){
logger.info("Go to cache");
// Update the cursor position for the next scan
cursor = res[0];
if (cursor === '0') {
return console.log('Iteration complete');
} else {
for (var i=0; i < replies.length; i++){
(function(i){
// Do some commands with the result
})(i)
}
setImmediate(function() { doscan() });
}
})
}
答案 1 :(得分:1)
正如stdob所说,代码中唯一不同步的部分是for
循环部分。就个人而言,我会创建一个child process并运行数据库查询以及您决定对输出做的任何事情。如果这对您的应用程序不起作用,您可能只需要延迟启动程序30秒或以不同方式处理缓存。
答案 2 :(得分:1)
你可以使用Iced-CoffeeScript https://github.com/Terebinth/britvic/blob/master/server/models/hive_iced.iced#L101