【Redis】.net core Redis事件订阅与发布,基础篇

news/2024/5/20 0:28:39 标签: redis, .netcore, 数据库

2023年,第38周。给自己一个目标,然后坚持总会有收货,不信你试试!
发布与订阅(Publish/Subscribe,也简称为 Pub/Sub)是一种消息传递模式,用于解耦发布者和订阅者之间的关系。

目录

  • 一、基本概念
    • 1.1、发布者(Publisher)
    • 1.2、主题(Topic)
    • 1.3、订阅者(Subscriber)
    • 1.4、消息(Message)
  • 二、简单例子
    • 2.1、安装 NuGet 包
    • 2.2、创建 Redis 连接
    • 2.3、发布事件
    • 2.4、订阅事件
  • 三、有序集合例子
    • 3.1、安装 NuGet 包
    • 3.2、创建 Redis 连接
    • 3.3、定义一个记录表的键
    • 3.4、发布事件
    • 3.5、订阅事件
  • 四、结合Sql Server表
    • 4.1、安装 NuGet 包
    • 4.2、创建 Redis 连接和 SQL Server 连接
    • 4.3、创建数据库表以存储事件信息
    • 4.4、发布事件
    • 4.5、订阅事件

在这里插入图片描述

一、基本概念

发布与订阅(Publish/Subscribe,也简称为 Pub/Sub)是一种消息传递模式,用于解耦发布者和订阅者之间的关系。

在发布与订阅模式中,发布者(Publisher)不会直接发送消息给特定的订阅者(Subscriber),而是将消息发布到一个或多个主题(Topic)。订阅者可以选择订阅感兴趣的主题,当有消息发布到被订阅的主题时,订阅者会接收到相应的消息。

关键概念:

1.1、发布者(Publisher)

负责将消息发布到特定的主题,不关心有哪些订阅者。

1.2、主题(Topic)

消息的分类或标签,在发布消息时指定主题。

1.3、订阅者(Subscriber)

选择订阅感兴趣的主题,当有消息发布到订阅的主题时,会接收到相应的消息。

1.4、消息(Message)

发布者发送的信息,包含数据和元数据。

发布者和订阅者之间的关系是解耦的,发布者无需知道具体有哪些订阅者,而订阅者只需关注自己感兴趣的主题。
这种模式可用于实现松耦合的系统设计,使得系统更易于扩展和维护。

发布与订阅模式常被应用于异步消息传递、事件驱动编程、消息队列等场景,例如消息中间件(如 RabbitMQ、Apache Kafka)就是基于发布与订阅模式的实现。

二、简单例子

在.NET Core中使用Redis进行事件订阅与发布非常简单。
下面是一个示例代码,演示了如何使用Redis进行事件的发布和订阅:

2.1、安装 NuGet 包

StackExchange.Redis

2.2、创建 Redis 连接

var redis = ConnectionMultiplexer.Connect("localhost");
var subscriber = redis.GetSubscriber();

2.3、发布事件

subscriber.Publish("channel", "message");

2.4、订阅事件

subscriber.Subscribe("channel", (channel, message) => {
    Console.WriteLine((string)message);
});

当有消息发布到指定的频道时,订阅者会接收到消息并执行指定的处理逻辑。

需要注意的是,这只是一个简单的示例,实际应用中可能需要考虑更多的情况,例如在后台运行订阅者、异常处理等等。
另外,你还可以使用模式匹配(通配符)来订阅多个频道。
有关更多高级用法和设置,请参考 StackExchange.Redis 的文档。

三、有序集合例子

在.NET Core中使用Redis进行事件订阅与发布时,如果你想要记录事件的发生情况,可以使用Redis的数据结构之一——有序集合(Sorted Set)来记录。

下面是一个示例代码,演示了如何使用有序集合来记录事件的发生情况:

3.1、安装 NuGet 包

StackExchange.Redis

3.2、创建 Redis 连接

var redis = ConnectionMultiplexer.Connect("localhost");
var db = redis.GetDatabase();
var subscriber = redis.GetSubscriber();

3.3、定义一个记录表的键

const string eventLogKey = "eventLog";

3.4、发布事件

string message = "message";
double timestamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
subscriber.Publish("channel", message);

// 记录事件到有序集合中,按照时间戳排序
db.SortedSetAdd(eventLogKey, message, timestamp);

3.5、订阅事件

subscriber.Subscribe("channel", (channel, message) => {
    Console.WriteLine((string)message);
    
    // 在事件发生时,更新有序集合中的时间戳
    double timestamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
    db.SortedSetAdd(eventLogKey, (string)message, timestamp);
});

通过使用有序集合,你可以在Redis中维护一个按照时间排序的事件记录表。
你可以根据需求使用SortedSet的各种操作,如根据时间范围获取事件记录、获取最新的事件等。

请注意,这只是一个基本示例,实际应用中可能需要考虑更多情况,如异常处理、清理过期事件等。
另外,建议根据实际的业务需求来优化记录表的结构和数据操作。
有关更多高级用法和设置,请参考 StackExchange.Redis 的文档。

四、结合Sql Server表

在.NET Core中使用Redis进行事件订阅与发布,并将事件信息添加到SQL Server数据库表中,你可以按照以下步骤进行操作:

4.1、安装 NuGet 包

StackExchange.Redis、Microsoft.Data.SqlClient

4.2、创建 Redis 连接和 SQL Server 连接

var redis = ConnectionMultiplexer.Connect("localhost");
var db = redis.GetDatabase();
var subscriber = redis.GetSubscriber();

string connectionString = "Your_SQL_Server_Connection_String";
using var connection = new SqlConnection(connectionString);

4.3、创建数据库表以存储事件信息

CREATE TABLE EventLog (
    Id INT IDENTITY(1,1) PRIMARY KEY,
    Channel NVARCHAR(100),
    Message NVARCHAR(MAX),
    Timestamp DATETIME
);

4.4、发布事件

string message = "message";
string channel = "channel";
DateTime timestamp = DateTime.UtcNow;

subscriber.Publish(channel, message);

// 添加事件信息到 SQL Server 数据库表中
string sql = @"INSERT INTO EventLog (Channel, Message, Timestamp)
               VALUES (@Channel, @Message, @Timestamp)";
connection.Execute(sql, new { Channel = channel, Message = message, Timestamp = timestamp });

4.5、订阅事件

subscriber.Subscribe("channel", (redisChannel, message) => {
    Console.WriteLine((string)message);
    
    // 添加事件信息到 SQL Server 数据库表中
    string sql = @"INSERT INTO EventLog (Channel, Message, Timestamp)
                   VALUES (@Channel, @Message, @Timestamp)";
    connection.Execute(sql, new { Channel = redisChannel, Message = (string)message, Timestamp = DateTime.UtcNow });
});

通过以上步骤,你可以在Redis中发布和订阅事件,同时将事件信息添加到SQL Server数据库表中存储。请根据你的实际需求进行适当的优化和异常处理。


http://www.niftyadmin.cn/n/5019059.html

相关文章

不到5分钟就被赶出来的面试,我直呼太变态了......

干了两年外包,本来想出来正儿八经找个互联网公司上班,没想到算法死在另一家厂子。 自从加入这家外包公司,每天都在加班,钱倒是给的不少,所以也就忍了。没想到7月一纸通知,所有人不许加班,薪资直…

vue3_动态添加路由,以及路由刷新后页面丢失问题

首先,是要将权限数据本地持久化存储 接着在router文件夹index.js中引入store中的权限数据,并导出一个方法,判断权限当中的数据,并跟roleEnum路由规则匹配,匹配上之后则addRoute() 在登录之后调用这个方法,动…

win11电脑怎么设置定时关机

我们可以给电脑设置一个定时关机的功能,这样当我们有事情而无法在电脑前等待关机的时候就可以让电脑自己关机了,那么win11系统怎么设置定时关机功能呢,这里小编给大家带来win11电脑定时关机的设置方法,还不太清楚的小伙伴快来看一…

【SpringMVC]获取参数的六种方式

目录 1.通过ServletAPI获取 2.通过控制器方法的形参获取 3.RequestParam:将请求参数和控制器方法的形参绑定 4.RequestHeader:将请求头信息与控制器方法的形参的值进行绑定 5. CookieValue:将cookie数据和控制器方法的形参绑定 Cookie&…

2023软件设计师上半年真题解析(上午+下午)

上午试题 1.系统总线 计算机中,系统总线用于()连接。 A.接口和外设 B.运算器,控制器和寄存器C.主存及外设部件 D.DMA控制器和中断控制器 总线可以划分为数据总线、地址总线和控制总线。系统总…

腾讯云4核8G服务器CVM S5性能测评及优惠价格表

腾讯云4核8G服务器CVM标准型S5实例性能测评,包括CPU型号、内存、系统盘、CVM实例规格性能测评,腾讯云4核8G租用优惠价格表,腾讯云服务器网分享腾讯云4核8G服务器CVM S5性能测评和租用费用: 目录 腾讯云4核8G服务器CVM S5性能测评…

【VAE】

个人网站:https://tianfeng.space 一、VAE 与普通自动编码器一样,变分自动编码器有编码器Encoder与解码器Decoderi两大部分组成,原始图像从编码器输入,经编码器后形成隐式表示(Latent Representation),之后隐式表示被…

ELK日志框架图总结

ELK日志框架图总结 本文目录 ELK日志框架图总结Elastic Stack介绍模式分层图beatselasticsearchkibana模式logstashelasticsearchkibana模式beatslogstashelasticsearchkibana模式beats缓存/消息队列logstashelasticsearchkibana模式elkspringboot Elastic Stack介绍 官网&…