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

时间: 2024-10-22 09:37:47

Redis 发布/订阅模式的相关文章

redis 发布/订阅 模式

发布/订阅模式的命令如下: * 进入发布订阅模式的客户端,不能执行除发布订阅模式以上命令的其他命令,否则出错.

Redis——发布订阅模式&amp;虚拟内存

一.    发布订阅消息 发布订阅(pub/Sub)是一种消息通信模式,主要的目的是解除消息发布者和消订阅者之间的耦合,Redis作为一个pub/sub的server,在订阅者和发布者之间起到了消息路由的功能.订阅者可以通过subscribe和psubscribe命令向Redis Server订阅自己感兴趣的消息类型,Redis将信息类型称为通道(channel).当发布者通过publish命令向Redis Server发送特定类型的信息时,订阅该信息类型的全部client都会收到此消息. 实例

redis的发布订阅模式

概要 redis的每个server实例都维护着一个保存服务器状态的redisServer结构 struct redisServer { /* Pubsub */ // 字典,键为频道,值为链表 // 链表中保存了所有订阅某个频道的客户端 // 新客户端总是被添加到链表的表尾 dict *pubsub_channels;  /* Map channels to list of subscribed clients */ // 这个链表记录了客户端订阅的所有模式的名字 list *pubsub_pa

Redis研究(十六)—发布/订阅模式

在上一篇中我们写了Redis的任务队列. 除了实现任务队列外,Redis还提供了一组命令可以让开发者实现"发布/订阅"(publish/subscribe)模式."发布/订阅"模式同样可以实现进程间的消息传递,其原理是这样的: "发布/订阅"模式中包含两种角色,分别是发布者和订阅者.订阅者可以订阅一个或若干个频道(channel),而发布者可以向指定的频道发送消息,所有订阅此频道的订阅者都会收到此消息. 发布者发布消息的命令是PUBLISH,用法

RedisRepository封装—Redis发布订阅以及StackExchange.Redis中的使用

本文版权归博客园和作者本人吴双共同所有,转载请注明本Redis系列分享地址.http://www.cnblogs.com/tdws/tag/NoSql/ Redis Pub/Sub模式 基本介绍 Redis发布订阅—Pub/Sub模式或者说是观察者模式.我想大家即使没有使用过,也已经耳熟能详了. 先简单举例说明下应用场景,在场景中我们可以分析到其优势在哪. 比如你的线上应用应用,你想设置一个日志报警系统,当应用出现异常的时候,立马发送通知给你,可能是短信的形式,也可能是邮件的形式.当然如果只将报

Redis 发布订阅

Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息. Redis 客户端可以订阅任意数量的频道. 下图展示了频道 channel1 , 以及订阅这个频道的三个客户端 —— client2 . client5 和 client1 之间的关系: 当有新消息通过 PUBLISH 命令发送给频道 channel1 时, 这个消息就会被发送给订阅它的三个客户端: 实例 以下实例演示了发布订阅是如何工作的.在我们实例中我们创建了订阅频道名为 redi

Redis发布订阅使用方法

Redis发布订阅 发布订阅模式中发布消息的为publisher即发布者,接收消息的为subscriber即订阅者.在Redis中,所有的消息通过channel即频道进行发布,一个发布者可以向多个channel发布消息,一个订阅者也可以订阅多个channel.Redis不对消息进行持久化,如果消息发布时订阅者还没有进行订阅,则不会再收到此消息. 发布订阅命令 命令 格式 说明 PUBLISH PUBLISH channel message 发布message到指定的channel SUBSCRI

[Redis]发布/订阅

摘要 有这样的一个场景,管理员需要发布一条消息,所有的客户端都要受到通知.然后想到了发布订阅模式.使用redis的发布与订阅实现起来更简单一些,说做就做,这里弄个简单的demo,先模拟下. 核心代码 首先使用Nuget安装redis程序集. 服务端发布消息webApi 向频道chanel-1 发送消息. public class MessageController : ApiController { [HttpGet] [Route("api/send/{msg}")] public

Redis发布订阅

Redis 的 pub sub实现了邮件系统,发送者(在 Redis 术语中被称为发布者)发送的邮件,而接收器(用户)接收它们.由该消息传送的链路被称为信道. Redis客户端可以订阅任何数目的通道. 例子 以下举例说明如何发布用户的概念工作.在下面的例子给出一个客户端订阅一个通道名为redisChat redis 127.0.0.1:6379> SUBSCRIBE redisChat Reading messages... (press Ctrl-C to quit) 1) "subsc