Redis用作Sub订阅与发布Pub

2024-03-08 17:50
文章标签 redis 发布 订阅 sub 用作 pub

本文主要是介绍Redis用作Sub订阅与发布Pub,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Redis用作Sub订阅与发布Pub

本作者从下载地址:https://download.csdn.net/download/LongtengGensSupreme/12157626下载redis包解压到本地文件目录:E:\Source\redisfile\Redis-x64-3.2.100,如下图所示

 

 

 

 

为了方便启动,我们在该目录下新建一个 startredis.bat 的文件,

然后将以下内容写入文件:redis-server redis.windows.conf

这个命令其实就是在调用 redis-server.exe 命令来读取 redis.window.conf 的内容,

双击刚才创建好的 startredis.bat 文件,就能成功的看到 Redis 启动,如下图所示:

 

redis-server启动之后放着就可以了。可以使用客户端自带工具来测试redis服务器是否可用,

Redis 自带的一个客户端工具,它可以用来连接到我们当前的 Redis 服务器,点击同一个文件夹下的 redis-cli.exe 文件,启动客户端,如下图

 

 

redis-cli客户端启动成功,如下图所示

 

我们做以下测试:在客户端dos界面输入 set key1 value1,回车,可以看到客户端显示:

 

在输入 get key1 回车,客户端显示:

  

 

通过上述工作,我们便在 Windows 的环境下安装好了Redis,我们的准备工作已完成。下面添加简单的使用Redis用作Sub订阅与发布Pub的案例,

以商品购买为案例,下单--》增加积分--》发送购买成功短信通知,如下:

1、新建控制台项目net console 控制台或者net core console控制台都可以,本文使用的是net core console控制台,取名 NetCoreConsoleTest,

在项目下添加积分类Order.cs和短信通知类SMS.cs

积分类Order.cs

using System;namespace NetCoreConsoleTest
{/// <summary>/// 积分处理/// </summary>public class Order{/// <summary>/// 积分订单/// </summary>public void AddOrder(string sn) {System.Threading.Thread.Sleep(TimeSpan.FromSeconds(1));Console.WriteLine($"订单 {sn} 处理积分完成");}}
}

短信通知类SMS.cs

using System;namespace NetCoreConsoleTest
{/// <summary>/// 短信处理/// </summary>public class SMS{/// <summary>/// 短信订单/// </summary>public void AddSMS(string sn){System.Threading.Thread.Sleep(TimeSpan.FromSeconds(1));Console.WriteLine($"订单 {sn} 处理发送短信完成");}}
}

NetCoreConsoleTest的Program.cs测试

using System;
using System.Diagnostics;namespace NetCoreConsoleTest
{class Program{static void Main(string[] args){Stopwatch stopwatch = new Stopwatch();stopwatch.Start();Console.WriteLine("...........网购处理过程............");string sn = $"WG{DateTime.Now.ToString("yyyMMddHHmmssfffffff")}";Console.WriteLine("...........处理订单............");Console.WriteLine($"订单 {sn} 处理完成");System.Threading.Thread.Sleep(TimeSpan.FromSeconds(1));#region 一般使用Console.WriteLine(".......................");Console.WriteLine("...........处理订单积分............");Order order = new Order();order.AddOrder(sn);Console.WriteLine(".......................");Console.WriteLine("...........处理订单发送短息............");SMS sMS = new SMS();sMS.AddSMS(sn);#endregionstopwatch.Stop();Console.WriteLine($"...........网购完成,总共用时{stopwatch.ElapsedMilliseconds}............");Console.ReadKey();}}
}

测试结果:

可以看到整个过程在3秒左右,

下面使用Redis用作Sub订阅与发布Pub

1、项目NetCoreConsoleTest,NuGet程序包管理,添加 StackExchange.Redis,然后添加SubAndPub.cs

using StackExchange.Redis;
using System;
namespace NetCoreConsoleTest
{/// <summary>/// 订阅与发布/// </summary>public class SubAndPub{ConnectionMultiplexer multiplexer;public SubAndPub(){multiplexer = ConnectionMultiplexer.Connect("localhost:6379");}/// <summary>/// 订阅/// </summary>public void Sub(Action<RedisChannel, RedisValue> handler){ISubscriber subscriber = multiplexer.GetSubscriber();subscriber.Subscribe("pub_sub", handler);}/// <summary>/// 发布/// </summary>public void Pub(RedisValue message){ISubscriber subscriber = multiplexer.GetSubscriber();subscriber.Publish("pub_sub", message);}}
}

2、添加控制台项目OrderForm和SMSForm

项目OrderForm

using NetCoreConsoleTest;
using System;namespace OrderForm
{public class Program{static void Main(string[] args){Console.WriteLine("积分");SubAndPub subAndPub = new SubAndPub();subAndPub.Sub((a, b) =>{System.Threading.Thread.Sleep(TimeSpan.FromSeconds(1));Console.WriteLine($"订单 {b}, 处理积分完成");});Console.ReadKey();}}
}

项目SMSForm

using NetCoreConsoleTest;
using System;namespace SMSForm
{public class Program{static void Main(string[] args){Console.WriteLine("短信");SubAndPub subAndPub = new SubAndPub();subAndPub.Sub((a, b) =>{System.Threading.Thread.Sleep(TimeSpan.FromSeconds(1));Console.WriteLine($"订单 {b} 发送短信完成");});Console.ReadKey();}}
}

NetCoreConsoleTest的Program中修改为如下

using StackExchange.Redis;
using System;
using System.Diagnostics;namespace NetCoreConsoleTest
{class Program{static void Main(string[] args){Stopwatch stopwatch = new Stopwatch();stopwatch.Start();#region pub sub 订阅发布string sn = null;SubAndPub subAndPub = new SubAndPub();for (int i = 0; i < 20; i++){sn = $"WG{DateTime.Now.ToString("yyyMMddHHmmssfffffff")}";Console.WriteLine($"生成第 {i} 个订单,订单号:{sn}");Console.WriteLine("...........处理订单............");Console.WriteLine($"订单 {sn} 处理完成");System.Threading.Thread.Sleep(TimeSpan.FromSeconds(1));//发布subAndPub.Pub(sn);System.Threading.Thread.Sleep(TimeSpan.FromSeconds(1));}#endregionstopwatch.Stop();Console.WriteLine($"...........网购完成,总共用时{stopwatch.ElapsedMilliseconds}............");Console.ReadKey();}}
}

生成上述NetCoreConsoleTest,OrderForm和SMSForm三个项目,然后启动redis服务器,先启动OrderForm和SMSForm项目,然后启动 NetCoreConsoleTest项目,运行结果

完整代码:https://download.csdn.net/download/LongtengGensSupreme/12254559

这篇关于Redis用作Sub订阅与发布Pub的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/787909

相关文章

高效+灵活,万博智云全球发布AWS无代理跨云容灾方案!

摘要 近日,万博智云推出了基于AWS的无代理跨云容灾解决方案,并与拉丁美洲,中东,亚洲的合作伙伴面向全球开展了联合发布。这一方案以AWS应用环境为基础,将HyperBDR平台的高效、灵活和成本效益优势与无代理功能相结合,为全球企业带来实现了更便捷、经济的数据保护。 一、全球联合发布 9月2日,万博智云CEO Michael Wong在线上平台发布AWS无代理跨云容灾解决方案的阐述视频,介绍了

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

Vue3项目开发——新闻发布管理系统(六)

文章目录 八、首页设计开发1、页面设计2、登录访问拦截实现3、用户基本信息显示①封装用户基本信息获取接口②用户基本信息存储③用户基本信息调用④用户基本信息动态渲染 4、退出功能实现①注册点击事件②添加退出功能③数据清理 5、代码下载 八、首页设计开发 登录成功后,系统就进入了首页。接下来,也就进行首页的开发了。 1、页面设计 系统页面主要分为三部分,左侧为系统的菜单栏,右侧

maven发布项目到私服-snapshot快照库和release发布库的区别和作用及maven常用命令

maven发布项目到私服-snapshot快照库和release发布库的区别和作用及maven常用命令 在日常的工作中由于各种原因,会出现这样一种情况,某些项目并没有打包至mvnrepository。如果采用原始直接打包放到lib目录的方式进行处理,便对项目的管理带来一些不必要的麻烦。例如版本升级后需要重新打包并,替换原有jar包等等一些额外的工作量和麻烦。为了避免这些不必要的麻烦,通常我们

禅道Docker安装包发布

禅道Docker安装包发布 大家好, 禅道Docker安装包发布。 一、下载地址 禅道开源版:   /dl/zentao/docker/docker_zentao.zip  备用下载地址:https://download.csdn.net/download/u013490585/16271485 数据库用户名: root,默认密码: 123456。运行时,可以设置 MYSQL_ROOT_P

Redis中使用布隆过滤器解决缓存穿透问题

一、缓存穿透(失效)问题 缓存穿透是指查询一个一定不存在的数据,由于缓存中没有命中,会去数据库中查询,而数据库中也没有该数据,并且每次查询都不会命中缓存,从而每次请求都直接打到了数据库上,这会给数据库带来巨大压力。 二、布隆过滤器原理 布隆过滤器(Bloom Filter)是一种空间效率很高的随机数据结构,它利用多个不同的哈希函数将一个元素映射到一个位数组中的多个位置,并将这些位置的值置

Lua 脚本在 Redis 中执行时的原子性以及与redis的事务的区别

在 Redis 中,Lua 脚本具有原子性是因为 Redis 保证在执行脚本时,脚本中的所有操作都会被当作一个不可分割的整体。具体来说,Redis 使用单线程的执行模型来处理命令,因此当 Lua 脚本在 Redis 中执行时,不会有其他命令打断脚本的执行过程。脚本中的所有操作都将连续执行,直到脚本执行完成后,Redis 才会继续处理其他客户端的请求。 Lua 脚本在 Redis 中原子性的原因

laravel框架实现redis分布式集群原理

在app/config/database.php中配置如下: 'redis' => array('cluster' => true,'default' => array('host' => '172.21.107.247','port' => 6379,),'redis1' => array('host' => '172.21.107.248','port' => 6379,),) 其中cl

Redis的rehash机制

在Redis中,键值对(Key-Value Pair)存储方式是由字典(Dict)保存的,而字典底层是通过哈希表来实现的。通过哈希表中的节点保存字典中的键值对。我们知道当HashMap中由于Hash冲突(负载因子)超过某个阈值时,出于链表性能的考虑,会进行Resize的操作。Redis也一样。 在redis的具体实现中,使用了一种叫做渐进式哈希(rehashing)的机制来提高字典的缩放效率,避

【吊打面试官系列-Redis面试题】说说 Redis 哈希槽的概念?

大家好,我是锋哥。今天分享关于 【说说 Redis 哈希槽的概念?】面试题,希望对大家有帮助; 说说 Redis 哈希槽的概念? Redis 集群没有使用一致性 hash,而是引入了哈希槽的概念,Redis 集群有 16384 个哈希槽,每个 key 通过 CRC16 校验后对 16384 取模来决定放置哪个槽, 集群的每个节点负责一部分 hash 槽。