redis发布订阅方法.net版

 

 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是单例模式的,如果是多线程的话会遇到很多坑 。处理办法是:重新实例化一个连接对象

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值