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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/129443.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华清远见第六课程day4作业

仿照string类&#xff0c;完成myString 类 #include <iostream> #include <cstring>using namespace std;class myString{ private:char *str;int size; public:myString():size(10){str new char[size];strcpy(str,"");}myString(const char*s){size …

【FPGA零基础学习之旅#12】三线制数码管驱动(74HC595)串行移位寄存器驱动

&#x1f389;欢迎来到FPGA专栏~三线制数码管驱动 ☆* o(≧▽≦)o *☆嗨~我是小夏与酒&#x1f379; ✨博客主页&#xff1a;小夏与酒的博客 &#x1f388;该系列文章专栏&#xff1a;FPGA学习之旅 文章作者技术和水平有限&#xff0c;如果文中出现错误&#xff0c;希望大家能指…

Transformer(二)—— ResNet(残差网络)

Transformer&#xff08;二&#xff09;—— ResNet&#xff08;残差网络&#xff09; 一、背景1.1 梯度消失/爆炸1.2 网络退化(Degradation) 二、思路2.1 为什么需要更深的网络2.2 理想中的深网络表现 三、实践和实验效果3.1 构造恒等映射&#xff1a;残差学习&#xff08;res…

0016Java程序设计-springboot幼儿园管理系统

摘 要目 录系统设计开发环境 摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于幼儿园管理系统当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了幼儿园管理系统&a…

【进阶篇】MySQL的MVCC实现机制详解

文章目录 0.前言1.基础介绍1.1. 什么是MVCC?1.1. 什么是当前读和快照读&#xff1f;1.1. 当前读&#xff0c;快照读和MVCC的关系1.1. MVCC能解决什么问题&#xff0c;好处是&#xff1f;1.1.1. 提高并发性能1.1.2. 避免死锁1.1.3. 解决脏读、不可重复读和幻读等问题1.1.4. 实现…

【unity3D】如何修改相机的默认视角

&#x1f497; 未来的游戏开发程序媛&#xff0c;现在的努力学习菜鸡 &#x1f4a6;本专栏是我关于游戏开发的学习笔记 &#x1f236;本篇是unity的如何修改相机的默认视角 如何修改相机的默认视角 Game窗口运行的话视角是这样的&#xff1a; 此时Scene窗口的视角是这样的&…

游戏发行平台都有什么服务和功能?

游戏发行平台通常提供一系列服务和功能&#xff0c;以帮助游戏开发商将游戏推向市场&#xff0c;并为玩家提供游戏。以下是一些常见的游戏发行平台服务和功能&#xff1a; 1、游戏发布 发行平台允许游戏开发商将游戏上传到平台上&#xff0c;以供玩家下载和安装。 2、游戏销售…

qt作业day4

//clock_exercise.cpp#include "clock_timer.h" #include "ui_clock_timer.h"//时间事件处理函数 void Clock_Timer::timerEvent(QTimerEvent *event) {if(event->timerId() time_id){sys_tm QDateTime :: currentDateTime(); // int year sy…

远程恋爱网站部署秘籍——群晖虚拟机助ni秀恩爱

文章目录 前言1. 安装网页运行环境1.1 安装php1.2 安装webstation 2. 下载网页源码文件2.1 访问网站地址并下载压缩包2.2 解压并上传至群辉NAS 3. 配置webstation3.1 配置网页服务3.2 配置网络门户 4. 局域网访问静态网页配置成功5. 使用cpolar发布静态网页&#xff0c;实现公网…

习题练习 C语言(暑期第四弹)

自我小提升&#xff01; 前言一、数组二、指针运算三、统计每个月兔子的总数四、双指针的应用五、判断指针六、珠玑妙算七、两数之和八、数组下标九、指针十、寻找峰值十一、二级指针十二、大端小端十三、无符号参数十四、数对十五、截取字符串总结 前言 重要的事说三遍&#…

分布式系统常用的模式

分布式系统常用的模式 Ambassador 名称&#xff1a;“大使”模式 介绍&#xff1a;作为应用程序和其他服务的“中间人”&#xff0c;负责应用程序和其他服务之间的通信&#xff0c;包括日志、监控或重试处理等任务。 举例&#xff1a;K8S使用Envoy作为一个“大使”来简化服务…

Docker 搭建Redis 集群之路

前言 搞技术就是动手,动手再动手,实践出真知,毕竟最终是要解决问题的呢,废话不多讲,开搞,主要是为了记录一下,毕竟过程还是有点艰辛呢需求(target) Windows 电脑 装一个虚拟机用虚拟机构造Linux 系统下载Docker 搭建Redis 集群代码交互集群过关斩将 检查电脑是否开启…

初识Kafka

kafka 第一章、初识Kafka 原先&#xff1a; kafka&#xff0c;由LinkedIn公司采用Scala语言开发的一个多分区&#xff0c;多副本&#xff0c;基于Zookeeper协调的分布式消息系统&#xff0c;被捐献给Apache基金会。 现在 分布式流式处理平台。 高吞吐 可持久化 可水平扩展 …

go小知识2

Golang开发新手常犯的50个错误_gezhonglei2007的博客-CSDN博客 一些题目整理&#xff0c;附带大佬的解释 1.go中哪些值不能寻址& 常量&#xff08;const常量&#xff0c;字面值3.14&#xff0c;字符串“xxx”&#xff0c;函数或方法, map的val值&#xff09; golang中接…

JVM系列 运行时数据区

系列文章目录 第一章 运行区实验 文章目录 系列文章目录前言一、堆&#xff08;Heap&#xff09;1.1、新生代/Young区1.1.1、Eden区1.1.2、Survival区 1.2、年老代&#xff08;old区&#xff09; 二、虚拟机栈&#xff08;Stack&#xff09;2.1、栈顶缓存技术2.2、溢出2.3、栈…

83 # 静态服务中间件 koa-static 的使用以及实现

静态服务中间件&#xff1a;koa-static 中间件可以决定是否向下执行&#xff0c;如果自己可以处理&#xff0c;那么直接处理完毕结束&#xff0c;如果自己处理不了&#xff0c;next 方法会继续向下执行 新建 public 文件夹&#xff0c;里面添加 index.html、style.css 文件 …

图的学习,深度和广度遍历

一、什么是图 表示“多对多”的关系 包括&#xff1a; 一组顶点&#xff1a;通常用V&#xff08;Vertex&#xff09;表示顶点集合一组边&#xff1a;通常用E&#xff08;Edge&#xff09;表示边的集合 边是顶点对&#xff1a;(v, w)∈E&#xff0c;其中v,w∈V有向边<v, w&…

go开发之个微机器人的二次开发

简要描述&#xff1a; 设置某条朋友圈为隐私 请求URL&#xff1a; http://域名地址/snsSetAsPrivacy 请求方式&#xff1a; POST 请求头Headers&#xff1a; Content-Type&#xff1a;application/jsonAuthorization&#xff1a;login接口返回 参数&#xff1a; 参数名…

CFTC可能比SEC更可怕,将监管炮口直接对准DeFi?

还未开始享受Uniswap在法庭上为DeFi行业带来的“胜利果实”&#xff0c;美国商品期货委员会&#xff08;CFTC&#xff09;在一个星期之后立即将其无情砸碎&#xff0c;并将其监管大炮直接对准了DeFi衍生品市场&#xff0c;乃至整个DeFi行业。 2023年9月7日&#xff0c;CFTC宣布…

leetcode 215.数组中第k大的元素

⭐️ 题目描述 &#x1f31f; leetcode链接&#xff1a;数组中第k大的元素 思路&#xff1a; 使用堆数据结构&#xff0c;大堆的堆顶是堆内最大的元素&#xff0c;也就是把当前堆 pop k - 1 次&#xff0c;第 k 次 top 出来的元素就是第 k 大的数。 代码&#xff1a; class …