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

相关推荐
·薯条大王4 小时前
MySQL联合查询
数据库·mysql
morris1316 小时前
【redis】redis实现分布式锁
数据库·redis·缓存·分布式锁
hycccccch6 小时前
Canal+RabbitMQ实现MySQL数据增量同步
java·数据库·后端·rabbitmq
这个懒人7 小时前
深入解析Translog机制:Elasticsearch的数据守护者
数据库·elasticsearch·nosql·translog
Yan-英杰7 小时前
【百日精通JAVA | SQL篇 | 第二篇】数据库操作
服务器·数据库·sql
NineData7 小时前
NineData云原生智能数据管理平台新功能发布|2025年3月版
数据库
爱的叹息8 小时前
spring boot集成reids的 RedisTemplate 序列化器详细对比(官方及非官方)
redis
weitinting8 小时前
Ali linux 通过yum安装redis
linux·redis
百代繁华一朝都-绮罗生9 小时前
检查是否存在占用内存过大的SQL
数据库·sql
吾日三省吾码9 小时前
Python 脚本:自动化你的日常任务
数据库·python·自动化