redis发布订阅效果如图
发布订阅在设计模式中也可以说是观察者模式,针对这个模式是处理对象间一对多的依赖关系的,当一个对象发生变化,其它依赖他的对象都要得到通知并更新。
然而它也有自己的缺点,就是当主题发生一系列的变化时,观察者都要做批量的更新,如果这样的更新成本很高,那么解决方法就是根据种类需求通知,而不能盲目的通知所有的观察者。
那针对这个缺点,一般的情况下,你没有需求谁订阅一个跟自己无关的消息推送呢?这也正好说明推送的消息需要整理而不能一窝蜂的什么消息都往一个通道里面抛,要分而治之,合理的设计发布通道的用途,也合理的订阅通道。
那么如此一来,升级到系统项目级别,他别给我们又带来啦,莫大的好处,便是:剥离系统耦合,减少单线功能的依赖关系,又正迎合啦高内聚,松耦合的系统架构设计。
现在贴上:2.4的redis版本
public static void Main(string[] args) { // var rr = RedisCacheHelper.Cache.GetClient(0); Task.Factory.StartNew(() => { try { var rr2 = RedisCacheHelper.Cache;//.GetClient(1); //创建订阅 IRedisSubscription subscription = rr2.CreateSubscription(); //接受到消息时的委托 subscription.OnMessage = (channel, msg) => { System.Console.WriteLine("频道【" + channel + "】订阅客户端接收消息:" + ":" + msg + " [" + DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss") + "]" + Environment.NewLine + Environment.NewLine); System.Console.WriteLine("订阅数:" + subscription.SubscriptionCount + "" + Environment.NewLine + Environment.NewLine); }; //订阅事件处理 subscription.OnSubscribe = channel => { System.Console.WriteLine("订阅客户端:开始订阅" + channel + "" + Environment.NewLine + Environment.NewLine); }; //取消订阅事件处理 subscription.OnUnSubscribe = a => { System.Console.WriteLine("订阅客户端:取消订阅" + Environment.NewLine + Environment.NewLine); }; subscription.SubscribeToChannels("key");//注意:订阅信道的时候 会开启阻塞模式,所以,需要将监听放到单独的线程里 } catch (Exception ex) { System.Console.WriteLine(ex.Message); } }); while (true) { var re = System.Console.ReadLine(); if (!string.IsNullOrWhiteSpace(re)) RedisCacheHelper.Sequence.PublishMessage("key", re); System.Console.WriteLine("已发送:" + re); }
贴上3.2的reids版本
/// <summary>
/// 订阅消息
/// </summary>
/// <param name="key"></param>
public static void Sub(string key)
{
Cache.Subscribe((key, RedisSubScribleMessage));
}
static void RedisSubScribleMessage(CSRedis.CSRedisClient.SubscribeMessageEventArgs e)
{
Console.WriteLine("收到" + e.Body.ToString());
}
redis是单例模式的,如果是多线程的话会遇到很多坑 。处理办法是:重新实例化一个连接对象