2014-05-15 50 views
1

我正在使用redis pub/sub做一些實時處理。我如何訂閱頻道,然後做其他事情而不會阻止?

在訂閱結束時,我想訂閱一個指定的頻道,然後做一些其他的計算。如果我向服務器發送subscribe命令,我將面臨困境,它會阻止代碼。

那麼我該怎麼做別的,當訂閱消息到達時,我通過回調處理程序來處理它?

回答

1

你需要兩個不同的連接來做到這一點。這是一個設計選擇,因爲當你SUBSCRIBE/PSUBSCRIBE時,實際上連接語義從Request-Response改變爲Push-style,所以它不適合在沒有實現更復雜的語義的情況下運行命令,例如IMAP協議。

0

第一點是將Redis連接專用於訂閱。一旦在連接上應用SUBSCRIBE或PUSBSCRIBE,就只能執行與訂閱相關的命令。因此,在C程序中,至少需要一個用於訂閱的連接,以及一個用於連接Redis的其他任何連接。

然後,您還需要找到一種方法來處理來自C程序的這兩個連接。可能有幾種解決方案。例如:

  • 使用多線程,並專用一個線程負責訂閱的連接。在接收新事件時,專用線程應該向主應用程序線程發送消息,這將激活回調。

  • 使用非阻塞和異步API。 Hiredis帶有事件迴路適配器。您需要一個事件循環來處理與Redis的連接(包括專用於訂閱的連接)。在接收到發佈事件後,相關的回調將直接由事件循環觸發。這裏是an example of subscription with hiredis and libevent