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

news2024/11/28 16:34:01

概念:

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

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

 

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

.net6实现Redis发布订阅

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

创建连接Redis类RedisConnectionHelper

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

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 ,用来发布订阅信息

    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,模仿其他服务器节点订阅频道的操作。 

   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 秒钟,以便程序不立即退出,从而保证订阅者有足够时间接收消息
 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# 开发者可以非常方便地使用这种模式来实现类似的功能。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2186670.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Java】—— 集合框架:Collection接口中的方法与迭代器(Iterator)

目录 1. 集合框架概述 1.1 生活中的容器 1.2 数组的特点与弊端 1.3 Java集合框架体系 1.4 集合的使用场景 2. Collection接口及方法 2.1 添加 2.2 判断 2.3 删除 2.4 其它 3. Iterator(迭代器)接口 3.1 Iterator接口 3.2 迭代器的执行原理 3.3 foreach循环 1. 集…

【rust/egui/android】在android中使用egui库

文章目录 说在前面AndroidStudio安装编译安装运行问题 说在前面 操作系统&#xff1a;windows11java版本&#xff1a;23android sdk版本&#xff1a;35android ndk版本&#xff1a;22rust版本&#xff1a; AndroidStudio安装 安装AndroidStudio是为了安装sdk、ndk&#xff0c;…

【Matlab绘图】从Excel导入表格并进行三维绘图

前言 今天手头上拿到一份论文的xlsx数据&#xff0c;要求使用MATLAB绘制进行三维图标坐标绘制。那么我们来看看如何使用如下数据进行绘图。 如上数据所示&#xff0c;数据是一个30行25列的数据&#xff0c;数据的内容是论文某项模型模拟的结果&#xff0c;我们希望把横坐标x取…

【ADC】ADC 系统失调和增益误差的校准方法

概述 本文学习于TI 高精度实验室课程&#xff0c;讨论如何计算增益和偏移误差并通过校准消除。首先对数据转换器系统进行偏移和增益误差计算&#xff0c;然后讨论几种校准此误差的方法。最后介绍一些难以校准的误差源。 文章目录 概述一、误差校准原理与方法二、实际应用问题举…

Linux进程概念二

我们利用fork函数来辅助我们讲解进程 首先认识两个调用进程地址的函数&#xff1a;getpid(),和getppid()&#xff0c;他们分别可以调用自己的pid和父进程的pid fork()可以在代码层面来创建子进程&#xff0c;一般而言&#xff0c;父进程fork出来的子进程与父进程代码和数据相…

【Docker】配置文件

问题 学习Docker期间会涉及到docker的很多配置文件&#xff0c;可能会涉及到的会有&#xff1a; /usr/lib/systemd/system/docker.service 【docker用于被systemd管理的配置文件】 /etc/systemd/system/docker.service.d【覆盖配置文件的存放处】 /etc/systemd/system/mul…

[Cocoa]_[初级]_[绘制文本如何设置断行效果]

场景 在开发Cocoa程序时&#xff0c;表格NSTableView是经常使用的控件。其基于View Base的视图单元格模式就是使用NSCell或其子类来控制每个单元格的呈现。当一个单元格里的文字过多时&#xff0c;需要截断超出宽度的文字&#xff0c;怎么实现&#xff1f; 说明 Cocoa下的文本…

【java数据结构】顺序表

【java数据结构】顺序表 一、了解List接口二、顺序表2.1 线性表2.2 顺序表2.2.1 顺序表接口的实现给数组增加新元素判断数组数据是否为满在 pos 位置新增元素判定是否包含某个元素查找某个元素对应的位置获取 pos 位置的元素给 pos 位置的元素设为 value删除第一次出现的关键字…

Manim:使用Python绘制数学动画

Manim是一个由3Blue1Brown的Grant Sanderson开发的开源框架&#xff0c;用户可以通过编写Python代码来创建数学动画&#xff0c;适用于教学、科研和科普宣传等多个领域。 Manim的核心功能之一是动画效果的创建和控制。它提供了多种动画效果&#xff0c;如创建、变换、淡入淡出…

分布式数据库知识详解

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

QT学习笔记3.1(建立项目、执行_建立第一个工程)

QT学习笔记3.1&#xff08;建立项目、执行_建立第一个工程) 建立第一个工程&#xff0c;使用widget模板 使用的版本是 Qt Creator 4.11.0 Based on Qt 5.14.0 (MSVC 2017, 32 bit) 1.选择Application-》QT Widget Application&#xff08;最常使用&#xff09; 2.项目保存位…

使用Pytorch构建自定义层并在模型中使用

使用Pytorch构建自定义层并在模型中使用 继承自nn.Module类&#xff0c;自定义名称为NoisyLinear的线性层&#xff0c;并在新模型定义过程中使用该自定义层。完整代码可以在jupyter nbviewer中在线访问。 import torch import torch.nn as nn from torch.utils.data import T…

LSM6DSV16X基于MLC智能笔动作识别(2)----MLC数据采集

LSM6DSV16X基于MLC智能笔动作识别.2--MLC数据采集 概述视频教学样品申请源码下载输出速率执行流程速率设置量程设置检测状态数据单位采集数据静止(Steady)闲置(Idle)书写(Writing)其他(other) 概述 MLC 是“机器学习核心”&#xff08;Machine Learning Core&#xff09;的缩写…

全球购的智能引擎:AI与RPA如何重塑跨境电商帝国?

在全球化的大潮中&#xff0c;跨境电商已成为连接世界的桥梁。随着人工智能&#xff08;AI&#xff09;和机器人流程自动化&#xff08;RPA&#xff09;技术的飞速发展&#xff0c;跨境电商领域的运作模式正在经历一场革命性的变革。 一、跨境电商的挑战 随着互联网技术的普及…

D3.js中国地图可视化

1、项目介绍 该项目来自Github&#xff0c;基于D3.js中国地图可视化。 D3.js is a JavaScript library for manipulating documents based on data. It uses HTML, SVG, and CSS to display data. The full name of D3 is "Data-Driven Documents," which means it a…

在VirtualBox中安装OpenEuler操作系统保姆级教程

前言 OpenEuler是一个由中国华为公司主导开发和维护的开源操作系统项目&#xff0c;旨在打造一个开放、可信且可扩展的企业级操作系统&#xff0c;适用于多种应用场景。 该项目致力于通过开放和协作的方式推动操作系统的创新与发展。OpenEuler采用开源软件模型&#xff0c;允…

多模态:Florence2论文详解

文章目录 前言一、介绍二、方法1.模型结构1&#xff09;Vision encoder2&#xff09;Multi-modality encoder decoder3&#xff09;Optimization objective 2.数据工程1&#xff09;Image Collection2&#xff09;Data Annotation3&#xff09;Data filtering and enhancement4…

spring学习日记-day8-声明式事务

一、学习目标 声明式事务是Spring框架提供的一种事务管理方式&#xff0c;其主要特点是通过声明&#xff08;而非编程&#xff09;的方式来处理事务。这种方式让事务管理不侵入业务逻辑代码&#xff0c;从而提高了代码的可维护性和可读性。 定义&#xff1a;声明式事务…

[3.4]【机器人运动学MATLAB实战分析】PUMA560机器人逆运动学MATLAB计算

PUMA560是六自由度关节型机器人,其6个关节都是转动副,属于6R型操作臂。各连杆坐标系如图1,连杆参数如表1所示。 图1 PUMA560机器人的各连杆坐标系 表1 PUMA560机器人的连杆参数 用代数法对其进行运动学反解。具体步骤如下: 1、求θ1 PMUMA56

【数据结构笔记13】

408数据结构答题规范 原视频 视频参考&#xff0c;以下为视频的笔记 需要写的部分 如果题目要求了函数名、参数列表、返回值类型就按题目的来 函数的类型可以是返回值类型或者void类型&#xff0c;如果函数名不清楚里面的功能是什么&#xff0c;在函数title下面最好写一行注…