1.Redis訂閱發布介紹
Redis訂閱發布是一種消息通信模式:發布者(publisher)發送消息,訂閱者(Subscriber)接受消息。類似於設計模式中的觀察者模式。
發布者和訂閱者之間使用頻道進行通信,當需要發送消息時,發布者通過publish命令將消息發送到頻道上,該消息就會發送給訂閱這個頻道的訂閱者。


圖片來自於http://www.runoob.com/redis/redis-pub-sub.html
2.ServiceStack.Redis
ServiceStack.Redis是Redis的C#版本的客戶端,是ServiceStack的一部分。
ServiceStack的地址為https://servicestack.net
3.訂閱者
首先創建RedisClient,然后調用CreateSubscription()方法創建訂閱客戶端,然后設置訂閱客戶端的幾個事件:
OnMessage:接受到消息時。
OnSubscribe:訂閱頻道時。
OnUnSubscribe:取消訂閱頻道時。
最后,調用subscribeToChannels(channelName),訂閱頻道。
詳細代碼如下:
1 /// <summary> 2 /// Redis訂閱 3 /// </summary> 4 public static void Subscribe() 5 { 6 using (RedisClient consumer = new RedisClient("127.0.0.1", 6379)) 7 { 8 //創建訂閱 9 IRedisSubscription subscription = consumer.CreateSubscription(); 10 //接受到消息時 11 subscription.OnMessage = (channel, msg) => 12 { 13 Console.WriteLine($"從頻道:{channel}上接受到消息:{msg},時間:{DateTime.Now.ToString("yyyyMMdd HH:mm:ss")}"); 14 Console.WriteLine($"頻道訂閱數目:{subscription.SubscriptionCount}"); 15 Console.WriteLine("___________________________________________________________________"); 16 }; 17 //訂閱頻道時 18 subscription.OnSubscribe = (channel) => 19 { 20 Console.WriteLine("訂閱客戶端:開始訂閱" + channel); 21 }; 22 //取消訂閱頻道時 23 subscription.OnUnSubscribe = (a) => { Console.WriteLine("訂閱客戶端:取消訂閱"); }; 24 25 //訂閱頻道 26 subscription.SubscribeToChannels("channel1"); 27 } 28 }
4.發布者
首先創建RedisClient,然后調用PublishMessage(channelName,message)發布消息。
詳細代碼如下:
RedisClient client = new RedisClient("127.0.0.1", 6379);
string message = "發布消息測試";
client.PublishMessage("channel1", message);
到目前為止,一個簡單的Redis發布訂閱就完成了。
5.Redis發布服務
使用發布者僅僅能夠發布消息,但是不能夠檢測一些事件的變化,Redis中還有一個RedisPublishServer的類,里面包括一些事件能夠使我們很好地檢測服務的運行。
OnMessage:接受到消息;
OnStart:發布服務開始運行時;
OnStop:發布服務停止運行時;
OnUnSubscribe:訂閱者取消訂閱時;
OnError:發布出現錯誤時;
OnFailover:Redis服務器冗余切換時;
發布服務端初始化完成后,調用Start()方法,開始執行發布服務。
發布服務執行后,執行消息的發布client.PublishMessage時,發布服務端也能夠接受到發布的消息。
詳細代碼如下:
1 public void Publish() 2 { 3 //PooledRedisClientManager 4 IRedisClientsManager redisClientManager = new PooledRedisClientManager("127.0.0.1:6379"); 5 //發布、訂閱服務 IRedisPubSubServer 6 RedisPubSubServer pubSubServer = new RedisPubSubServer(redisClientManager, "channel1") 7 { 8 OnMessage = (channel, msg) => 9 { 10 Console.WriteLine($"從頻道:{channel}上接受到消息:{msg},時間:{DateTime.Now.ToString("yyyyMMdd HH:mm:ss")}"); 11 Console.WriteLine("___________________________________________________________________"); 12 }, 13 OnStart = () => 14 { 15 Console.WriteLine("發布服務已啟動"); 16 Console.WriteLine("___________________________________________________________________"); 17 }, 18 OnStop = () => { Console.WriteLine("發布服務停止"); }, 19 OnUnSubscribe = channel => { Console.WriteLine(channel); }, 20 OnError = e => { Console.WriteLine(e.Message); }, 21 OnFailover = s => { Console.WriteLine(s); }, 22 }; 23 //接收消息 24 pubSubServer.Start(); 25 }
