码迷,mamicode.com
首页 > 其他好文 > 详细

Redis 发布/订阅模式

时间:2017-09-20 19:31:44      阅读:217      评论:0      收藏:0      [点我收藏+]

标签:实现   状态   using   技术   模式   多个   logs   源码   for   

一.命令简介

1.PSUBSCRIBE 订阅一个或多个符合给定模式的频道。
2.PUBLISH 将信息 message 发送到指定的频道 channel 。
3.PUBSUB 是一个查看订阅与发布系统状态的内省命令, 它由数个不同格式的子命令组成
4.PUNSUBSCRIBE 指示客户端退订所有给定模式。
5.SUBSCRIBE 订阅给定的一个或多个频道的信息。
6.UNSUBSCRIBE 指示客户端退订给定的频道。

二.例子

1.订阅msg

技术分享

2.发送信息

技术分享

技术分享

三.代码实现

using Newtonsoft.Json;
using StackExchange.Redis;
using System;

namespace ResdisPubSub.PubSub
{
    /// <summary>
    /// 通过redis实现的订阅-发布机制
    /// </summary>
    public class RedisSubscribe : ISubscribeService
    {
        //链接
        static ConnectionMultiplexer redis;

        static RedisSubscribe()
        {
            ConfigurationOptions config = new ConfigurationOptions()
            {
                AbortOnConnectFail = false,
                ConnectRetry = 10,
                ConnectTimeout = 5000,
                ResolveDns = true,
                SyncTimeout = 5000,
                EndPoints = { { "127.0.0.1:6379" } },
                Password = "111111",
                AllowAdmin = true,
                KeepAlive = 180
            };
            redis = ConnectionMultiplexer.Connect(config);
        }

        /// <summary>
        /// 发布消息
        /// </summary>
        /// <typeparam name="T">消息类型</typeparam>
        /// <param name="channel">频道:消息的名称</param>
        /// <param name="msg">消息内容</param>
        /// <returns></returns>
        public void Publish<T>(string channel, T msg)
        {
            try
            {
                if (redis != null && redis.IsConnected)
                {
                    redis.GetSubscriber().Publish(channel, JsonConvert.SerializeObject(msg));
                }
            }
            catch (InvalidOperationException ex)
            {
                Console.WriteLine("redis服务错误,详细信息:" + ex.Message + ",来源:" + ex.Source);
            }
   
        }

        /// <summary>
        /// 订阅消息
        /// </summary>
        /// <param name="subChannel">频道:消息的名称</param>
        /// <param name="action">收到消息后的处理</param>
        public void Subscribe(string subChannel, Action<string> action)
        {
            try
            {
                if (redis != null && redis.IsConnected)
                {
                    redis.GetSubscriber().Subscribe(subChannel, (channel, message) => { action(message); });
                }
            }
            catch (InvalidOperationException ex)
            {
                Console.WriteLine("redis服务错误,详细信息:" + ex.Message + ",来源:" + ex.Source);
            }

        }

        /// <summary>
        /// 取消订阅
        /// </summary>
        /// <param name="channel">频道:消息的名称</param>
        public void Unsubscribe(string channel)
        {
            try
            {
                if (redis != null && redis.IsConnected)
                {
                    redis.GetSubscriber().Unsubscribe(channel);
                }
            }
            catch (InvalidOperationException ex)
            {
                Console.WriteLine("redis服务错误,详细信息:" + ex.Message + ",来源:" + ex.Source);
            }

        }

        /// <summary>
        /// 取消全部订阅
        /// </summary>
        public void UnsubscribeAll()
        {
            try
            {
                if (redis != null && redis.IsConnected)
                {
                    redis.GetSubscriber().UnsubscribeAll();
                }
            }
            catch (InvalidOperationException ex)
            {
                Console.WriteLine("redis服务错误,详细信息:" + ex.Message + ",来源:" + ex.Source);
            }
   
        }
    }
}

 

    class Program
    {
        static ISubscribeService client = new RedisSubscribe();
        static void Main(string[] args)
        {
            client.Subscribe("bigbigChannel", m => { Console.WriteLine($"我是bigbigChannel,接收到信息:{m}"); });
            Thread t = new Thread(Run);
            t.Start();
        }

        static void Run()
        {
            for (int i = 0; i < 100; i++)
            {
                Thread.Sleep(1000);
                client.Publish("bigbigChannel", i.ToString());
            }
       
        }
    }

 

技术分享

 源码下载:https://github.com/lgxlsm/ResdisPubSub

Redis 发布/订阅模式

标签:实现   状态   using   技术   模式   多个   logs   源码   for   

原文地址:http://www.cnblogs.com/lgxlsm/p/7562944.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!