StackExchange Redis如何實現BRPOP/BLPOP

今天在使用StackExchange Redis客戶端時。我想要使用BRPOP,可是我發現StackExchange Redis並無提供API,沒辦法只好找資料看文檔了。git

原來StackExchange Redis使用的是Multiplexing(多路複用),也就是說它只跟redis server維持單個鏈接。當有併發請求時,它會自動使用管道(pipeline)發送每一個請求,每一個請求都須要等待直到先前的請求執行完畢。基於這個緣由,StackExchange Redis不提供BRPOP/BLPOP相應的api, 由於這兩個操做頗有可能會阻塞整個Mulitplexer。github

那麼,有什麼方法來實現BRPOP/BLPOP操做呢。文檔中給出了答案,使用pub/sub:redis

sub.Subscribe(channel, () => {
    string work = db.ListRightPop(key);
    if (work != null) Process(work);
});
//...
db.ListLeftPush(key, newWork, flags: CommandFlags.FireAndForget);
sub.Publish(channel, "");

注:1.這種實現方式中數據並非真正經過pub/sub傳遞的,pub/sub僅僅是通知,也就是說當有數據加入到隊列中時,就去通知訂閱者,讓訂閱者從列表中取出數據。api

      2.當有多個消費者訂閱時,只有一個消費者能取到該值併發

      3.若是沒有消費者訂閱時,數據將一直存在列表中spa

      4.當你的消費者由於重啓沒收到加入新數據的通知時,你須要確保消費者可以處理這種積壓的數據(這個彷佛比較麻煩..)code

 

參考資料:https://github.com/StackExchange/StackExchange.Redis/blob/master/Docs/PipelinesMultiplexers.mdserver

相關文章
相關標籤/搜索