redis 實現任務隊列


讓生產者使用lpush 命令加入到某個鍵中,另一個消費者不斷使用rpop從該鍵中取出任務;偽代碼:

loop
    $task = RPOP queue
    if $task
        execute($task)  # 有就執行
    else
        wait 1 second ## 等待1 秒

可以使用BRPOP命令來優化上面的代碼。

BRPOP 和 RPOP 相似,區別是當列表中沒有元素的時候, BRPOP 會一直阻塞住連接,直到有新元素加入

loop
    $task = BRPOP  queue ,0
    execute($task)

BRPOP 接受2個參數,第一個是鍵名,第二個是超時時間,單位是秒。當超過時間仍沒有新元素就返回nil;0表示不限制等待時間,沒有新元素就一直阻塞。

redis A > BRPOP queue 0
redis B > LPUSH queue task

優先級隊列

BRPOP 可以監聽多個鍵。完整的命令格式為BRPOP key [key...] timeout.如果所有鍵都沒有值則阻塞,如果多個鍵都有元素則按照從左到右的順序取第一個鍵中的一個元素。利用優先級隊列,我們實現將優先消費哪個隊列中的任務:

loop
    $task = BRPOP queue:confirmation.email,
            queue:notifaication.email,
            0
    execute($task)

發布/訂閱模式

包含2種角色:發布者和訂閱者

發布者。發布的消息不會持久化,也就是訂閱者只能訂閱訂閱之后的消息

publish channel.1 hi #向 channel.1發送hi消息

訂閱者

subscribe channel.1  # 訂閱channel.1的消息
unsubscribe channel.1 #  取消訂閱,如果不跟參數,則取消所有訂閱信息
## 按照規則訂閱
psubscribe channel.?*  #psubscribe 支持通配符
punsubscribe [pattern [pattern ...]] # 取消訂閱,不跟參數,取消所有


免責聲明!

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



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