2013-03-24 23 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); 
    }); 
} 
相關問題