【Redis】.net core Redis事件订阅与发布,基础篇
  mYBoJjuwHxar 2023年11月02日 36 0


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、订阅事件


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

一、基本概念

发布与订阅(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数据库表中存储。请根据你的实际需求进行适当的优化和异常处理。


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  xaeiTka4h8LY   24天前   22   0   0 yumredis
mYBoJjuwHxar
最新推荐 更多

2024-05-17