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

2023年,第38周。给自己一个目标,然后坚持总会有收货,不信你试试!

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

目录

一、基本概念

发布与订阅(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 连接

csharp 复制代码
var redis = ConnectionMultiplexer.Connect("localhost");
var subscriber = redis.GetSubscriber();

2.3、发布事件

csharp 复制代码
subscriber.Publish("channel", "message");

2.4、订阅事件

csharp 复制代码
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 连接

csharp 复制代码
var redis = ConnectionMultiplexer.Connect("localhost");
var db = redis.GetDatabase();
var subscriber = redis.GetSubscriber();

3.3、定义一个记录表的键

csharp 复制代码
const string eventLogKey = "eventLog";

3.4、发布事件

csharp 复制代码
string message = "message";
double timestamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
subscriber.Publish("channel", message);

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

3.5、订阅事件

csharp 复制代码
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 连接

csharp 复制代码
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、创建数据库表以存储事件信息

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

4.4、发布事件

csharp 复制代码
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、订阅事件

csharp 复制代码
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数据库表中存储。请根据你的实际需求进行适当的优化和异常处理。

相关推荐
倔强的石头_14 小时前
kingbase备份与恢复实战(二)—— sys_dump库级逻辑备份与恢复(Windows详细步骤)
数据库
jiayou642 天前
KingbaseES 实战:深度解析数据库对象访问权限管理
数据库
李广坤3 天前
MySQL 大表字段变更实践(改名 + 改类型 + 改长度)
数据库
爱可生开源社区4 天前
2026 年,优秀的 DBA 需要具备哪些素质?
数据库·人工智能·dba
随逸1774 天前
《从零搭建NestJS项目》
数据库·typescript
加号35 天前
windows系统下mysql多源数据库同步部署
数据库·windows·mysql
シ風箏5 天前
MySQL【部署 04】Docker部署 MySQL8.0.32 版本(网盘镜像及启动命令分享)
数据库·mysql·docker
李慕婉学姐5 天前
Springboot智慧社区系统设计与开发6n99s526(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端
百锦再5 天前
Django实现接口token检测的实现方案
数据库·python·django·sqlite·flask·fastapi·pip
tryCbest5 天前
数据库SQL学习
数据库·sql