Redis訊息佇列

2021-12-29 22:16:06 字數 2240 閱讀 4621

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

訂閱操作

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

發布操作

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

【**1】:

subscribe "redis. blog"【**2】

publish "redis.blog" "hello redis"【圖1】

退訂操作

命令為:unsubscribe [channel] [channel] ..,如【**3】所示。

【**3】

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中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訂閱模式:即是在當前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)來驅動的,事件會單獨開一篇來介紹。

Redis訊息佇列

redis的訊息佇列使用簡單,沒有什麼配置,比activemq要輕量級太多,當然功能也比較簡單,如果只需要簡單的訂閱以及發布,可以考慮使用它。訂閱操作 命令為 subscribe channel channel 如 1 所示,即成功訂閱頻道 redis.blog 發布操作 命令為publish ch...

Redis 訊息佇列

訊息佇列,是在構建大型專案的時候 經常會用到的中間價系統,使用訊息佇列有很多好處,例如 1.實現各元件之間的松耦合。利用訊息系統可以使各個元件之間面向資料,而不是面向具體的介面。2.易於擴充套件。對於訊息系統而言,消費者和生產者都可以橫向擴充套件。提到佇列,很自然的就會想到redis的列表型別,可以...

redis實現訊息佇列

用redis實現乙個訊息通知系統,總結了一下技術細節,其中演示 如果沒有特殊說明,使用的都是phpredis擴充套件來實現的。記憶體 比如要推送一條全域性訊息,如果真的給所有使用者都推送一遍的話,那麼會占用很大的記憶體,實際上不管粘性有多高的產品,活躍使用者同全部使用者比起來,都會小很多,所以如果只...