StackExchange Redis如何實現BRPOP/BLPOP


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

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

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

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僅僅是通知,也就是說當有數據加入到隊列中時,就去通知訂閱者,讓訂閱者從列表中取出數據。

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

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

      4.當你的消費者因為重啟沒收到加入新數據的通知時,你需要確保消費者能夠處理這種積壓的數據(這個似乎比較麻煩..)

 

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM