关闭

.NET平台下Redis使用(六)【ServiceStack.Redis发布、订阅服务示例】

标签: redis.net发布
10187人阅读 评论(4) 收藏 举报
分类:

人所缺乏的不是才干而是志向,不是成功的能力而是勤劳的意志。


订阅者

首先创建RedisClient,然后调用CreateSubscription()方法创建订阅客户端,然后设置订阅客户端的几个事件:

OnMessage:接受到消息时。

OnSubscribe:订阅频道时。

OnUnSubscribe:取消订阅频道时。

最后,调用subscribeToChannels(channelName),订阅频道。

 class Program
    {
        static void Main(string[] args)
        {

            //订阅
            Subscription();
        }

        /// <summary>
        /// 订阅
        /// 一个客户端订阅channel-1
        /// </summary>
        public static void Subscription()
        {
            using (var consumer = new RedisClient("127.0.0.1", 6379, "123456"))
            {
                //创建订阅
                IRedisSubscription subscription = consumer.CreateSubscription();

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

                //订阅事件处理
                subscription.OnSubscribe = channel => { Console.WriteLine("订阅客户端:开始订阅" + channel); };

                //取消订阅事件处理
                subscription.OnUnSubscribe = a => { Console.WriteLine("订阅客户端:取消订阅"); };

                //订阅频道
                subscription.SubscribeToChannels("channel-1");

            }
        }

    }

发布者

首先创建RedisClient,然后调用PublishMessage(channelName,message)发布消息。

class Program
    {
        static void Main(string[] args)
        {

            using (IRedisClient publisher = new RedisClient("127.0.0.1", 6379, "123456"))
            {
                for (int i = 1; i <= 100; i++)
                {
                    publisher.PublishMessage("channel-1", string.Format("这是我发送的第{0}消息!", i));
                    Thread.Sleep(200);
                }
            }
        }
    }

结果如图:

这里写图片描述


这里写图片描述

Redis发布订阅 服务

  class Program
    {
        static void Main(string[] args)
        { 
            //发布服务
            Pub();
            Console.ReadLine();
        }

        #region Redis发布服务
        //使用发布者仅仅能够发布消息,但是不能够检测一些事件的变化,Redis中还有一个RedisPublishServer的类,里面包括一些事件能够使我们很好地检测服务的运行。
        //OnMessage:接受到消息;
        //OnStart:发布服务开始运行时;
        //OnStop:发布服务停止运行时;
        //OnUnSubscribe:订阅者取消订阅时;
        //OnError:发布出现错误时;
        //OnFailover:Redis服务器冗余切换时;
        //发布服务端初始化完成后,调用Start()方法,开始执行发布服务。
        //发布服务执行后,执行消息的发布client.PublishMessage时,发布服务端也能够接受到发布的消息。
        public static void Pub()
        {
            //PooledRedisClientManager
            IRedisClientsManager RedisClientManager = new PooledRedisClientManager("123456@127.0.0.1:6379");

            //发布、订阅服务 IRedisPubSubServer'
            //订阅频道channel-1,channel-2
            var pubSubServer = new RedisPubSubServer(RedisClientManager, "channel-1", "channel-2");

            //接受到消息时的委托
            pubSubServer.OnMessage = (channel, msg) =>
            {

                Console.WriteLine("【Redis发布服务APP】从频道{0}接收消息:{1}  时间:{2}", channel, msg, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"));
                Console.WriteLine("___________________________________________________________________");
            };
            pubSubServer.OnStart = () =>
            {
                Console.WriteLine("发布服务已启动");
                Console.WriteLine("___________________________________________________________________");
            };
            pubSubServer.OnStop = () => { Console.WriteLine("服务停止"); };

            //取消订阅频道时
            pubSubServer.OnUnSubscribe = channel =>
            {
                Console.WriteLine(channel);
            };
            pubSubServer.OnError = e => { Console.WriteLine(e.Message); };
            pubSubServer.OnFailover = s => { Console.WriteLine(s); };
            //pubSubServer.OnHeartbeatReceived = () => { Console.WriteLine("OnHeartbeatReceived"); };
            //pubSubServer.OnHeartbeatSent = () => { Console.WriteLine("OnHeartbeatSent"); };
            //pubSubServer.IsSentinelSubscription = true;
            //接收消息
            pubSubServer.Start();
        }
        #endregion
    }

当运行发布者,此发布订阅服务程序执行如图:

这里写图片描述

1
1
查看评论

redis的发布和订阅功能

原理 redis的发布和订阅是个比较高深的概念,我一开始接触的时候感觉很茫然,但是后面用了下发现还是简单的。看来还是多需要自己尝试。 其实和消息队列差不多的原理,就是一个发布的频道,所有订阅这个频道的都能收到消息。即一个client可以订阅多个 channel,也可以向多个channel发送消息...
  • Rodgexue
  • Rodgexue
  • 2016-08-03 10:18
  • 7122

redis之发布与订阅(publish/subscribe模式)

发布与订阅(publish/subscribe)模式,简称为pub/sub模式,redis也实现了这种模式。redis提供的发布订阅命令 命令 用例和描述 subscribe subscribe channel [channel …] 订阅一个或多个频道 unsubscribe ...
  • u011499747
  • u011499747
  • 2016-04-24 12:30
  • 10265

ServiceStack.Redis订阅发布服务的调用(Z)

1.Redis订阅发布介绍Redis订阅发布是一种消息通信模式:发布者(publisher)发送消息,订阅者(Subscriber)接受消息。类似于设计模式中的观察者模式。发布者和订阅者之间使用频道进行通信,当需要发送消息时,发布者通过publish命令将消息发送到频道上,该消息就会发送给订阅这个频...
  • u010265681
  • u010265681
  • 2017-08-03 22:21
  • 235

.Net Redis实现发布/订阅(RedisPubSubServer)

Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。本示例演示了怎么样通过Redis服务,来实现发布/订阅服务。借助于ServiceStack.Redis客户端,我们可以轻松来实现这些功能。在这里,依然采...
  • linybo
  • linybo
  • 2016-07-13 11:43
  • 1064

redis实现发布/订阅

发布/订阅模式的原型是这样的:有两类主体,生产者和消费者,生产者会将需要处理的任务放到任务队列中,而消费者则不断地从任务队列中读取任务并执行。生产者和消费者只需要提前定义好任务队列的格式,双方并不需要了解对方的实现细节。由于双方是基于任务队列进行交互的,所以,新增生产者或新增消费者都比较容易。总的来...
  • daguanjia11
  • daguanjia11
  • 2015-11-30 12:33
  • 1121

Redis学习笔记(十)消息通知(任务队列和发布订阅模式)

Redis学习笔记(十)消息通知(任务队列和发布订阅模式)1. 任务队列1.1 任务队列的特点任务队列:顾名思义,就是“传递消息的队列”。与任务队列进行交互的实体有两类,一类是生产者(producer),另一类则是消费者(consumer)。生产者将需要处理的任务放入任务队列中,而消费者则不断地从任...
  • men_wen
  • men_wen
  • 2017-03-15 21:30
  • 7997

redis消息队列订阅发布

MessageQueueUtil.publish(MsgTopic.CUSTOMER_INFO_UPDATE, JSON.toJSONString(reqCustomerInfo));//这个表示消息的发布工作 /** * 监听客户信息同步消息 * @param message * @param c...
  • mll999888
  • mll999888
  • 2017-05-18 15:23
  • 154

从零开始,搭建博客系统MVC5+EF6搭建框架(3),添加Nlog日志、缓存机制(MemoryCache、RedisCache)、创建控制器父类BaseController

一、回顾系统进度以及本章概要      目前博客系统已经数据库创建、以及依赖注入Autofac集成,接下来就是日志和缓存集成,这里日志用的是Nlog,其实还有其他的日志框架如log4,这些博客园都有很多介绍,这里就不说了,缓存机制用的是微软自带的Memory...
  • wo4366175
  • wo4366175
  • 2017-02-13 20:41
  • 1135

.net redis数据缓存(二) redis操作List集合带分页

redis net
  • qq_27337291
  • qq_27337291
  • 2017-08-27 12:51
  • 803

C# Redis 使用

概念   Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集...
  • mss359681091
  • mss359681091
  • 2017-02-24 14:16
  • 2621
    个人资料
    • 访问:1297989次
    • 积分:18624
    • 等级:
    • 排名:第591名
    • 原创:312篇
    • 转载:932篇
    • 译文:123篇
    • 评论:297条
    博客专栏
    文章分类
    打赏
    如果你觉得我的文章对您有用,请随意打赏。 微信 支付宝