Redis系列(三)-Redis發布訂閱及客戶端編程


閱讀目錄

  1. 發布訂閱模型
  2. Redis中的發布訂閱
  3. 客戶端編程示例
  4. 0.3版本Hredis

發布訂閱模型

在應用級其作用是為了減少依賴關系,通常也叫觀察者模式。主要是把耦合點單獨抽離出來作為第三方,隔離易變化的發送方和接收方。

發送方:只負責向第三方發送消息。(雜志社把讀者雜志交給郵局)
接收方:被動接收消息。(1:向郵局訂閱讀者雜志,2:門口去接郵過來的雜志)
第三方作用是:存儲訂閱雜志的接收方,並在雜志過來時送給接收方。 (郵局)

C#示例,發送方把雜志放到郵局里面:

    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實現完整的發布訂閱范式,就是說任何一台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.*

取消訂閱

取消普通訂閱和取消模式訂閱的命令。

UNSUBSCRIBE  bar
PUNSUBSCRIBE  ba*

取消在官方提供的連接工具中無法模擬的。

查看訂閱信息

查看訂閱消息是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 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();

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM