2013-03-24 58 views
4

我想让Node.js进程运行,因为它正在检查Redis服务器是否有新的弹出窗口。如何从Redis弹出对象,因为它们是实时添加的?

另一个进程将会偶尔进行推送,并且Node进程将试图弹出进来的任何消息.Node进程将保持运行。

任何人都可以指点我一个好方向吗?

我想弄清楚如何听这样的事件。当然,我可以弹出一次,但是如何让Node进程继续监听Redis服务器的任何添加?

回答

9

你要使用拦截弹出:http://redis.io/commands/brpop

function waitForPush() { 
    client.brpop(['list','otherlist',0], function (listName, item) { 
    // do stuff 
    waitForPush(); 
    }); 
} 
+0

感谢回答,但我真的坚持'如何倾听'部分。我无法围绕使用什么战略。我想过运行一个while循环,运行一个服务器,等等。 – deeJ 2013-03-24 19:39:19

+0

如果在您提供的列表中有任何内容,或者如果没有它会阻止Redis客户端,直到出现某些内容,则阻止弹出窗口。 – generalhenry 2013-03-24 19:41:08

+0

那么,一个可能的解决方案是有一个递归函数来连续检查?我应该尝试一下。谢谢。! – deeJ 2013-03-24 19:44:44

11

这似乎是一个很好的用例的pub/sub:http://redis.io/topics/pubsub

你Node.js的过程,偶尔推向Redis的能每次推送内容时也会发布到频道。像这样:

var pushClient = redis.createClient(); 
//push something onto Redis 
pushClient.publish("pubsub-channel", "Just pushed something onto Redis"); 

然后您的其他进程将订阅该频道。每个消息事件被触发的时候,你去歇一切只是推:

var client = redis.createClient(); 
client.subscribe("pubsub-channel"); 
client.on("message", function(channel, message){ 
//pop off new item 
}); 
1

如何递归函数的修改版采用了process.nextTick(...)

function waitForPush() { 
    client.brpop(['list','otherlist',0], function (listName, item) { 
    // do stuff 
    process.nextTick(waitForPush); 
    }); 
} 
相关问题