Redis釋出訂閱及客戶端程式設計
釋出訂閱模型
在應用級其作用是為了減少依賴關係,通常也叫觀察者模式。主要是把耦合點單獨抽離出來作為第三方,隔離易變化的傳送方和接收方。
傳送方:只負責向第三方傳送訊息。(雜誌社把讀者雜誌交給郵局)
接收方:被動接收訊息。(1:向郵局訂閱讀者雜誌,2:門口去接郵過來的雜誌)
第三方作用是:儲存訂閱雜誌的接收方,並在雜誌過來時送給接收方。 (郵局)
示例,傳送方把雜誌放到郵局裡面:
if (QA.AddBug()) EmailNotify();
接收方到郵局登記地址,有雜誌過來時送貨上門:
EmailNotify += () => { Console.WriteLine("A君"); }; EmailNotify += () => { Console.WriteLine("B君"); };
第三方郵局接受讀者雜誌訂閱,收到雜誌時進行派送:
public delegate void MessageHandler(); public static event MessageHandlerEmailNotify; if (QA.AddBug()) EmailNotify();
當我們把觀察者模式放大到系統級時,就是釋出訂閱(pub/sub)了。 主要是用來降低釋出者和訂閱者的耦合,提高前端系統吞吐量。結構如圖:

Redis中的釋出訂閱
Redis實現完整的釋出訂閱正規化,就是說任何一臺redis伺服器,啟動後都可以當做釋出訂閱伺服器。
普通訂閱
啟動訂閱者client。
redis-cli.exe -h 127.0.0.1 -p 6379
訂閱bar頻道。格式:SUBSCRIBE name1 name2。
成功訂閱回覆,分別對應訂閱型別、訂閱頻道、訂閱數量。
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。
127.0.0.1:6379> publish bar val (integer) 1
訂閱client回覆,分別對應訊息型別,頻道,訊息。
1) "message" 2) "bar" 3) "val"
圖例

模式訂閱
Redis支援模式匹配訂閱,*為模糊匹配符。
訂閱所有頻道的訊息
PSUBSCRIBE *
訂閱以news.開頭的所有頻道。
PSUBSCRIBE news.*
取消訂閱
取消普通訂閱和取消模式訂閱的命令。
UNSUBSCRIBEbar PUNSUBSCRIBEba*
取消在官方提供的連線工具中無法模擬的。
檢視訂閱資訊
檢視訂閱訊息是redis在2.8中心增加的命令之一。
pubsub channels [pattern] 。
返回當前伺服器被訂閱的所有頻道。
127.0.0.1:6379> pubsub channels 1) "bar"
指定匹配引數,返回與模式匹配的所有頻道。
127.0.0.1:6379> pubsub channels ba* 1) "bar"
pubsub numsub [channel-1 channel-2 ...channel-n]
接受任意多個頻道作為輸入引數,返回這些頻道的訂閱者數量。
127.0.0.1:6379> pubsub numsubbar 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();
0.3版本HRedis
基本使用
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");
及上面的訂閱。
開源地址 https://github.com/mushroomsir/HRedis
喜歡這篇文章的朋友可以點個喜歡,也可以關注一下我的個人專題:Java成長之路
針對於上面所涉及到的知識點我總結出了有1到5年開發經驗的程式設計師在面試中涉及到的絕大部分架構面試題及答案做成了文件和架構視訊資料免費分享給大家(包括Dubbo、Redis、Netty、zookeeper、Spring cloud、分散式、高併發等架構技術資料),希望能幫助到您面試前的複習且找到一個好的工作,也節省大家在網上搜索資料的時間來學習,也可以關注我一下以後會有更多幹貨分享。
資料獲取方式: QQ群搜尋“708-701-457” 即可免費領取


