Redis 发布/订阅模式

Posted 积少成多

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis 发布/订阅模式相关的知识,希望对你有一定的参考价值。

一.命令简介

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 发布/订阅模式的主要内容,如果未能解决你的问题,请参考以下文章

redis发布订阅模式

Redis订阅和发布模式和Redis事务

RedisRedis 发布订阅通信模式 ( 发布订阅模式 | 订阅频道 | 发布消息 | 接收消息 )

redis 发布/订阅 模式

spring-redis 发布订阅模式:发布一条消息收到了两条,重复监听

Redis基础---消息通信模式