今天在使用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