程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> DB2數據庫 >> DB2教程 >> Redis消息隊列

Redis消息隊列

編輯:DB2教程

Redis消息隊列


Redis的消息隊列使用簡單,沒有什麼配置,比ActiveMQ要輕量級太多,當然功能也比較簡單,如果只需要簡單的訂閱以及發布,可以考慮使用它。

訂閱操作

命令為:subscribe [channel] [channel] ..,如【代碼1】所示,即成功訂閱頻道[redis.blog]。

發布操作

命令為publish [channel] [message],如【代碼2】所示,【圖1】為訂閱的客戶端展示效果。
【代碼1】:

subscribe "redis. blog"

【代碼2】

publish "redis.blog" "hello redis"

【圖1】
圖1

退訂操作<喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vc3Ryb25nPjwvcD4KCjxwPsP8we7OqqO6dW5zdWJzY3JpYmUgW2NoYW5uZWxdIFtjaGFubmVsXSAuLqOsyOehvrT6wuszob/L+cq+oaMgPGJyPgqhvrT6wuszob88L3A+CgoKCjxwcmUgY2xhc3M9"brush:sql;">unsubscribe "redis.blog"

模式訂閱

命令為:psubscribe [pattern] [pattern]…,如【代碼4】所示,如果發布的消息符合當前訂閱的模式,亦會收到消息通知,如【圖2】所示。
【代碼4】

psubscribe "redis.*"

【圖2】
這裡寫圖片描述

模式退訂
命令為:punsubscribe [pattern] [pattern]…,如【代碼5】所示。
【代碼5】

punsubscribe "redis.*"

數據結構
關於頻道以及模式,redis通過兩個struct實現,在redisServer中是如下定義的:

struct rediServer{
    dict *pubsub_channels;
    list *pubsub_patterns;
}

頻道是一個dict,pubsub_channels中key為頻道名稱,value為一個list,list中存儲了所有訂閱當前頻道的client機器;
訂閱:如果當前頻道還不存在,則subscribe操作即為一次dictAdd操作,如果存在,則相當於將當前的client append到當前channel對應的value list中;
退訂:從dict中get(channel)獲得list,從list中刪除當前client,如果刪除後list為空,則表示當前頻道已經沒有訂閱者了,此時將會刪除當前channel。

模式是一個list,list中每個node為一個pubsubPattern結構,定義如下:

typedef struct pubsubPattern{
redisClient *client;
robj *pattern;
} 

訂閱模式:即是在當前list隊尾插入一個pubsubPattern;
退訂模式:則是遍歷list刪除匹配節點的過程。
即使不同client訂閱同一個模式,也是兩個不同的node,或者同一個client訂閱2個不同模式,亦為兩個node,這一點從pubsubPattern的數據結構上能看出來。

發送消息
發布一條信息,redis服務器會執行2個操作:

將消息發送給相應頻道的所有訂閱者,具體操作為:
以當前頻道為key,在當前pubsub_channels字典中找到對應的value,value為一個訂閱者list,遍歷該list,將消息發送給所有的訂閱者; 將消息發送給與當前頻道相匹配的所有模式,具體操作為:
以當前頻道為key,在當前pubsub_patterns列表中遍歷所有節點,如果某個節點(pubsubPattern)的pattern值和key匹配,則將消息發送給當前節點的client,遍歷結束為止。

另外的三個命令

pubsub channels:查看當前所有頻道;也可以使用通配,返回所有匹配的平道(pubsub channels “redis.*”); pubsub numsub: 接收任意多個頻道作為輸入參數,返回這些頻道的訂閱者數量; pubsub numpat:返回服務器當前被訂閱模式的數量;

至於如何將發布的消息及時反饋給所有訂閱者,redis是通過服務器的文件事件來操作的,不單單是消息隊列功能,所有的get,set操作都是通過文件事件(file event)來驅動的,事件會單獨開一篇來介紹。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved