閱讀目錄前端
在應用級其做用是爲了減小依賴關係,一般也叫觀察者模式。主要是把耦合點單獨抽離出來做爲第三方,隔離易變化的發送方和接收方。git
發送方:只負責向第三方發送消息。(雜誌社把讀者雜誌交給郵局)
接收方:被動接收消息。(1:向郵局訂閱讀者雜誌,2:門口去接郵過來的雜誌)
第三方做用是:存儲訂閱雜誌的接收方,並在雜誌過來時送給接收方。 (郵局)github
C#示例,發送方把雜誌放到郵局裏面: redis
if (QA.AddBug()) EmailNotify();
接收方到郵局登記地址,有雜誌過來時送貨上門:
EmailNotify += () => { Console.WriteLine("A君"); }; EmailNotify += () => { Console.WriteLine("B君"); };
第三方郵局接受讀者雜誌訂閱,收到雜誌時進行派送:編程
public delegate void MessageHandler(); public static event MessageHandler EmailNotify; if (QA.AddBug()) EmailNotify();
當咱們把觀察者模式放大到系統級時,就是發佈訂閱(pub/sub)了。 主要是用來下降發佈者和訂閱者的耦合,提升前端系統吞吐量。結構如圖:服務器
Redis實現完整的發佈訂閱範式,就是說任何一臺redis服務器,啓動後均可以當作發佈訂閱服務器。工具
啓動訂閱者client。ui
redis-cli.exe -h 127.0.0.1 -p 6379
訂閱bar頻道。格式:SUBSCRIBE name1 name2。
成功訂閱回覆,分別對應訂閱類型、訂閱頻道、訂閱數量。spa
127.0.0.1:6379> SUBSCRIBE bar Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "bar" 3) (integer) 1
新起個發佈者client,發送消息。格式:publish channelName Message。code
127.0.0.1:6379> publish bar val (integer) 1
訂閱client回覆,分別對應消息類型,頻道,消息。
1) "message" 2) "bar" 3) "val"
圖例
Redis支持模式匹配訂閱,*爲模糊匹配符。
訂閱全部頻道的消息
PSUBSCRIBE *
訂閱以news.開頭的全部頻道。
PSUBSCRIBE news.*
取消普通訂閱和取消模式訂閱的命令。
UNSUBSCRIBE bar
PUNSUBSCRIBE ba*
取消在官方提供的鏈接工具中沒法模擬的。
查看訂閱消息是redis在2.8中心增長的命令之一。
返回當前服務器被訂閱的全部頻道。
127.0.0.1:6379> pubsub channels 1) "bar"
指定匹配參數,返回與模式匹配的全部頻道。
127.0.0.1:6379> pubsub channels ba* 1) "bar"
接受任意多個頻道做爲輸入參數,返回這些頻道的訂閱者數量。
127.0.0.1:6379> pubsub numsub bar bar2 1) "bar" 2) (integer) 1 3) "bar2" 4) (integer) 0
RedisPubSub client = new RedisPubSub("127.0.0.1", 6381); client.OnUnSubscribe += (obj) => { Console.WriteLine(); }; client.OnMessage = (sender, arcgs) =>{ Console.WriteLine(arcgs); }; client.OnError = (Exception) => { Console.WriteLine(Exception.Message); }; client.Subscribe("bar"); Console.ReadLine();
using (RedisClient client = new RedisClient("127.0.0.1", 6381)) { client.Set("key", "value"); client.Get("key"); }
PoolRedisClient prc = new PoolRedisClient(new PoolConfiguration()); prc.Single.Set("key", "value"); prc.Single.Get("key");