[Redis] .net core Redis イベントのサブスクリプションと公開、基本

2023年、第38週。自分に目標を与えて、それに固執すれば必ず何かを得ることができます。信じられないなら、試してみてください。
パブリッシュ/サブスクライブ (Pub/Sub とも呼ばれます) は、パブリッシャーとサブスクライバー間の関係を分離するために使用されるメッセージング モデルです。

ここに画像の説明を挿入します

1. 基本的な考え方

パブリッシュ/サブスクライブ (Pub/Sub とも呼ばれます) は、パブリッシャーとサブスクライバー間の関係を分離するために使用されるメッセージング モデルです。

パブリッシュおよびサブスクライブ モデルでは、パブリッシャー (Publisher) は特定のサブスクライバー (Subscriber) にメッセージを直接送信しませんが、メッセージを 1 つ以上のトピック (Topic) にパブリッシュします。サブスクライバーは、関心のあるトピックをサブスクライブすることを選択できます。サブスクライブしたトピックにメッセージがパブリッシュされると、サブスクライバーは対応するメッセージを受信します。

主要な概念:

1.1. 発行元

サブスクライバーに関係なく、特定のトピックにメッセージをパブリッシュする責任を負います。

1.2. トピック

メッセージのカテゴリまたはラベル。メッセージを公開するときにトピックを指定します。

1.3. 加入者

関心のあるトピックを購読することを選択します。購読したトピックにメッセージがパブリッシュされると、対応するメッセージが受信されます。

1.4. メッセージ

発行者によって送信される、データとメタデータを含む情報。

発行者と購読者の関係は切り離されており、発行者はどの購読者がいるのかを知る必要がなく、購読者は興味のあるトピックだけに注意を払う必要があります。
このパターンを使用すると、疎結合システム設計を実装できるため、システムの拡張と保守が容易になります。

パブリッシュ アンド サブスクライブ モデルは、非同期メッセージング、イベント駆動型プログラミング、メッセージ キュー、その他のシナリオでよく使用されます。たとえば、メッセージ ミドルウェア (RabbitMQ、Apache Kafka など) は、パブリッシュ アンド サブスクライブ モデルに基づいて実装されます。

2. 簡単な例

.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 のドキュメントを参照してください。

3. オーダーセット例

イベントのサブスクリプションと .NET Core での発行に Redis を使用する場合、イベントの発生を記録する場合は、Redis のデータ構造の 1 つであるソート セット (ソート セット) を使用して記録できます。

以下は、並べ替えられたコレクションを使用してイベントの発生を記録する方法を示すサンプル コードです。

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 のドキュメントを参照してください。

4. 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 データベース テーブルに追加して保存できます。実際のニーズに応じて、適切な最適化と例外処理を実行してください。

おすすめ

転載: blog.csdn.net/lmy_520/article/details/132802323