.net 使用Redis发布订阅

订阅,取消订阅和发布实现了发布/订阅消息范式(引自wikipedia),发送者(发布者)不是计划发送消息给特定的接收者(订阅者)。而是发布的消息分到不同的频道,不需要知道什么样的订阅者订阅。订阅者对一个或多个频道感兴趣,只需接收感兴趣的消息,不需要知道什么样的发布者发布的。这种发布者和订阅者的解耦合可以带来更大的扩展性和更加动态的网络拓扑。

订阅信道

消息推送

 

在这里我就不介绍相关发布和订阅的命令,网上太多了,一搜一大堆;

开始对redis相关dll的引用,可以通过通过NuGet获取对ServiceStack.Redis的引用

下面是我自己定义的一个winform界面,主要用来订阅和发布

 

public Form1()
        {
            Control.CheckForIllegalCrossThreadCalls = false;
            InitializeComponent();
            
        }

        /// <summary>
        /// 订阅
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            Subscription(this.textBox2.Text);
        }

        /// <summary>
        /// 发布
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button2_Click(object sender, EventArgs e)
        {
            RedisPublish();
        }
        #region 自定义方法
         /// <summary>
        /// 订阅
        /// </summary>
        /// <param name="strTo">订阅主题</param>
        public void Subscription(string strTo)
        {
            Task.Factory.StartNew(() =>
                   {
                       try
                       {
                           using (var consumer = new RedisClient("192.168.16.207", 6379, "123456"))
                           {
                               //创建订阅
                               IRedisSubscription subscription = consumer.CreateSubscription();

                               //接受到消息时的委托
                               subscription.OnMessage = (channel, msg) =>
                               {
                                   this.textBox1.AppendText("频道【" + channel + "】订阅客户端接收消息:" + ":" + msg + " [" + DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss") + "]"+ Environment.NewLine + Environment.NewLine);
                                   this.textBox1.AppendText("订阅数:" + subscription.SubscriptionCount + ""+ Environment.NewLine + Environment.NewLine);
                               };

                               //订阅事件处理
                               subscription.OnSubscribe = channel => { this.textBox1.AppendText("订阅客户端:开始订阅" + channel + "" + Environment.NewLine + Environment.NewLine); };

                               //取消订阅事件处理
                               subscription.OnUnSubscribe = a => { this.textBox1.AppendText("订阅客户端:取消订阅" + Environment.NewLine + Environment.NewLine); };
                               subscription.SubscribeToChannels(strTo);//注意:订阅信道的时候 会开启阻塞模式,所以,需要将监听放到单独的线程里
                           }
                       }
                       catch (Exception ex)
                       {
                           this.textBox1.AppendText(ex.Message);
                       }
                   });
        }

        /// <summary>
        /// 发布
        /// </summary>
        public void RedisPublish()
        {
            using (IRedisClient publisher = new RedisClient("192.168.16.207", 6379, "123456"))
            {
                publisher.PublishMessage(this.textBox3.Text,this.textBox4.Text);
            }
        }

 效果图就是这样的

                       

报线程间操作无效: 从不是创建控件“textBox1”的线程访问它。请加上Control.CheckForIllegalCrossThreadCalls = false;

到此为止就完咯

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值