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