C# (.net6)实现Redis发布和订阅简单案例

概念:

在 .NET 6 中使用 Redis 的/订发布阅模式。发布/订阅(Pub/Sub)是 Redis 支持的一种消息传递模式,其中一个或多个发布者向一个或多个订阅者发送消息,Redis 客户端可以订阅任意数量的频道。

多个客户端可以订阅一个相同的频道如下图所示:

当有新消息通过 PUBLISH 命令发送给频道 channel1 时, 这个消息就会被发送给订阅它的三个客户端,一个信息可以通过频道发布给多个客户端:

.net6实现Redis发布订阅

先安装StackExchange.Redis包,引入依赖。

创建连接Redis类RedisConnectionHelper

redis默认用6379端口,前提是本地安装了redis服务

cs 复制代码
public static class RedisConnectionHelper
{
    private static Lazy<ConnectionMultiplexer> lazyConnection = new Lazy<ConnectionMultiplexer>(() =>
    {
        // 连接到 Redis 服务器,localhost:6379 是本地默认 Redis 服务器地址
        return ConnectionMultiplexer.Connect("127.0.0.1:6379");
    });

    public static ConnectionMultiplexer Connection => lazyConnection.Value;
}
创建发布信息类RedisPublisher ,用来发布订阅信息
cs 复制代码
    public class RedisPublisher
    {/// <summary>
    /// 发布
    /// </summary>
    /// <param name="channel"></param>
    /// <param name="message"></param>
        public void PublishMessage(string channel, string message)
        {
            // 获取 Redis 连接
            var redis = RedisConnectionHelper.Connection;

            // 获取 Redis 数据库
            var db = redis.GetDatabase();

            // 发布消息到指定频道
            //通过 ISubscriber 对象,你可以发布消息,也可以订阅某个频道。
            ISubscriber sub = redis.GetSubscriber();
        //channel: 要发布消息的频道名称。频道可以是任何字符串,当发布者发送消息时,所有订阅了这个频道的订阅者都会收到消息。
       ///  message: 发布的消息内容。这可以是任何可以转换为字符串的内容(如纯文本、JSON、XML等)。
       //当这行代码执行时,消息会被发送到 channel,并通知所有当前订阅了该频道的客户端。
  
            sub.Publish(channel, message);

            Console.WriteLine($"消息已发布到频道 {channel}: {message}");
            //换句话说,发布者发送的消息被"广播"给所有订阅了该频道的监听者。
        }
    }

创建订阅信息类RedisSubscriber,模仿其他服务器节点订阅频道的操作。

cs 复制代码
   public class RedisSubscriber
    {
        /// <summary>
        /// 订阅
        /// </summary>
        /// <param name="channel"></param>
        public void SubscribeToChannel(string channel)
        {
            // 获取 Redis 连接
            var redis = RedisConnectionHelper.Connection;

            // 获取 Redis 数据库
            ISubscriber sub = redis.GetSubscriber();
            //通过 sub.Subscribe 方法订阅了一个指定的 Redis 频道,
            //    并且定义了一个回调函数,当该频道收到消息时,回调函数会被触发,执行相应的逻辑或者业务。
            // 订阅指定频道
            sub.Subscribe(channel, (redisChannel, message) =>
            {
            //redisChannel它代表当前接收到消息的 Redis 频道名称。
            //redisChannel: 这是自动传入的参数,代表的是消息来自的频道名称。
            //    这对于订阅多个频道时尤其有用,因为你可以知道具体是哪一个频道发来的消息。
                // 当收到消息时触发
                Console.WriteLine($"我是教师管理功能模块,从频道 {redisChannel} 收到消息: {message}");
                Console.WriteLine("我可以做相关业务了~~~~");
            });

            Console.WriteLine($"已订阅频道: {channel}");
        }
    }
运行Main方法代码
  • 创建发布者和订阅者对象。
  • 订阅 test-channel 频道,确保订阅者可以接收到发布到该频道的消息。
  • 发布者向 test-channel 发布一条消息,所有订阅者将收到该消息。
  • 延迟 5 秒钟,以便程序不立即退出,从而保证订阅者有足够时间接收消息
cs 复制代码
 static async Task Main(string[] args)
        { ///Redis 是一种"广播"式的消息传递系统,任何订阅了该频道的客户端都可以接收到消息。


            // 创建发布者和订阅者实例
            var publisher = new RedisPublisher();
            var subscriber = new RedisSubscriber();

            // 订阅一个频道
            subscriber.SubscribeToChannel("test-channel");

            // 发布者发布消息到频道
            publisher.PublishMessage("test-channel", "我是学生管理这个功能模块的,我一把所有2025学生的毕业生学生设置为了已经毕业状态了");

            // 防止应用程序立即退出
            await Task.Delay(5000);
        }
运行结果
总结:

Redis 的发布/订阅模式非常适用于实现实时的消息传递系统,比如聊天应用、通知服务等。通过 StackExchange.Redis 库,C# 开发者可以非常方便地使用这种模式来实现类似的功能。

相关推荐
devpotato9 小时前
缓存与数据库更新顺序不一致问题
java·数据库·redis
天若有情6739 小时前
Node+MySQL小型全栈笔记项目实战课程分享
数据库·笔记·mysql
wxwx_bscxy3229 小时前
基于springboot宠物领养系统的设计与实现
数据库·spring boot·后端·spring·宠物
九月要晚安10 小时前
达梦DW与AFC对比
数据库
实战派K8S&DB10 小时前
如何在内网配置 TiDB 数据库 Agent
数据库·人工智能·分布式·tidb
实战派K8S&DB10 小时前
《基于 Dify + FastAPI + PyTiDB 搭建大模型驱动的 TiDB 智能运维 Agent》
运维·数据库·分布式·云原生·tidb·fastapi
SelectDB10 小时前
Apache Doris 5.0 年度版本前瞻(一):构建统一的多模湖仓实时分析平台
大数据·数据库·数据分析
小白学大数据10 小时前
超简单:用 Python 让 Excel 飞起来:用 openpyxl 把重复报表整理交给脚本
开发语言·数据库·python·excel
西索斯coding11 小时前
doubao-seed-2.1-turbo 调用一直 401 怎么办?pro 版同样的 Key 却正常——5 分钟排查定位指南
java·服务器·数据库·ai
2601_9623010111 小时前
深入理解缓存(Cache):原理、应用与优化
缓存·计算机原理·优化策略·数据访问·系统性能