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 StackExchange.Redis;
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);
            #endregion

            stopwatch.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));
            }
            #endregion

           

            stopwatch.Stop();
            Console.WriteLine($"...........网购完成,总共用时{stopwatch.ElapsedMilliseconds}............");
            Console.ReadKey();
        }
    }
}

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

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

猜你喜欢

转载自www.cnblogs.com/1175429393wljblog/p/12516890.html