redis學習筆記(20) 發布與訂閱

2021-07-11 20:01:39 字數 1726 閱讀 4064

redis的發布與訂閱功能由以下幾個命令實現:

序號命令及描述

1subscribe

訂閱給定的乙個或多個頻道的資訊

2publish

將資訊 message 傳送到指定的頻道 channel

3pubsub

檢視訂閱與發布系統狀態

4psubscribe

訂閱乙個或多個符合給定模式的頻道

客戶端a通過subscribe命令訂閱頻道「news」,客戶端b通過命令publish發布「news」頻道的資訊,可以發現客戶端a會收到這條資訊

redis將所有的訂閱關係都儲存在字典pubsub_channels中,這個字典的鍵key為被訂閱的頻道,對應的value是乙個鍊錶,指向所有訂閱了這個channel的客戶端

struct redisserver ;
每個client也維護了乙個這樣的字典pubsub_channels,用來記錄每個client所訂閱的頻道。這個字典的key為訂閱的頻道,value為null

typedef struct redisclient  redisclient;
假設有三個客戶端:client a、client b、client c

其中a訂閱了頻道news和it,b訂閱了頻道news,c訂閱了頻道it

則乙個基本的示意圖如下:

server的字典中儲存了兩對key-value對,key為news時,對應的鍊錶中有a和b兩個client

key為it時,對應的鍊錶中有a和c兩個client。

client a的字典中儲存著兩個key-value對,key為news和it兩個頻道,value為null

void subscribecommand(redisclient *c) 

int pubsubsubscribechannel(redisclient *c, robj *channel) else

//將這個client加入到鍊錶尾部

listaddnodetail(clients,c);

}//將資訊返回給客戶端

addreply(c,shared.mbulkhdr[3]);

addreply(c,shared.subscribebulk);

addreplybulk(c,channel);

addreplylonglong(c,clientsubscriptionscount(c));

return retval;

}

void publishcommand(redisclient *c) 

int pubsubpublishmessage(robj *channel, robj *message)

}//向所有匹配模式的使用者傳送資訊

if (listlength(server.pubsub_patterns))

}return receivers;

}

本文所引用的原始碼全部來自redis3.0.7版本

redis學習參考資料:

redis 設計與實現(第二版)

golang使用rabbitmq(三)發布 訂閱

rabbitmq訊息傳遞模型的核心是生產者永遠不會把訊息直接傳送到某個佇列上,甚至根本不知道訊息是否傳送到佇列上。生產者只向交換器傳送訊息。交換器來決定怎麼處理訊息,是把訊息傳遞到特定的佇列,還是把訊息傳到多個佇列,或者直接丟棄訊息,這一切取決於交換器的型別。交換器的型別有四種 direct,top...

redis學習筆記05 發布訂閱模式

由於redis訊息佇列並不支援多播機制,即生產者產出一次,由中介軟體複製傳送給多個消費者的機制,為了彌補這個不足,單獨引入了發布訂閱模式的模組。使用方式如下 生產者 import redis client redis.strictredis client.publish ll pythonbooks...

Redis學習 4 發布訂閱

redis 發布訂閱 pub sub 是一種訊息通訊模式 傳送者 pub 傳送訊息,訂閱者 sub 接收訊息。redis 客戶端可以訂閱任意數量的頻道。當有新訊息通過 publish 命令傳送給頻道 channel1 時,這個訊息就會被傳送給訂閱它的三個客戶端 訂閱乙個或多個符合給定模式的頻道。pu...