Asp.net core中RedisMQ的简单应用实现_实用技巧

来源:脚本之家  责任编辑:小易  

最近一个外部的项目,使用到了消息队列,本来是用rabbitmq实现的,但是由于是部署到别人家的服务器上,想尽量简化一些,项目中本来也要接入了redis缓存,就尝试使用redis来实现简单的消息队列。

使用redis做消息队列有两种方法,一种是使用pub/sub,另一种是使用list结构,配合brpop来消费。这两种方式各有特点,这里简述一下:

pub/sub模式,支持多客户端消费,但是不支持持久化,这就意味着客户端断开的时间内发布的消息将会全部舍弃掉。 list配合brpop,默认不支持多客户端消费,支持持久化。这种模式的多客户端消费可以变相实现,比如下面的伪代码:
#第一步push消息到队列
lpush listA msg
#第二步,一个专门的分发客户端取出消息,push到各个子队列
var msg=brpop listA
lpush listA1 msg
lpush listA2 msg
......
#第三步,多个客户端从对应的队列消费消息
var client1_msg= brpop listA1
var client2_msg= brpop listA2
......

消息丢失不太可取,所以我选择了list ,下一步需要选择一个合适的客户端。
Stackexchange.redis 算是一个老牌的客户端了,但是由于其采用多路复用的模式,没法支持Redis的blocking pops特性。所以我采用了国人写的CSRedisCore。

首先需要在appsettings.json中添加redis的连接字符串:

{
 "ConnectionStrings": {
  "redis": "{ip}:{port},password=123456,prefix=my_"
 }
}

具体配置请参考github上的文档:https://github.com/2881099/csredis

然后在startup.cs的ConfigureServices中配置redis:

    public void ConfigureServices(IServiceCollection services)
    {
      //redis配置
      RedisHelper.Initialization(new CSRedis.CSRedisClient(Configuration.GetConnectionString("redis")));
    }

当然也可以采用依赖注入的方式添加CSRedisClient实例,这个不纠结。

在项目中有好几处使用到了队列,所以先封装一个消费服务:

  public abstract class RedisMQConsumer : BackgroundService
  {
    protected abstract string CacheKey { get; }

    protected ILogger<RedisMQConsumer> logger;

    public RedisMQConsumer(ILogger<RedisMQConsumer> logger)
    {
      this.logger = logger;
    }

    protected override Task ExecuteAsync(CancellationToken stoppingToken)
    {
      return Task.Run( async() =>
      {
        while (!stoppingToken.IsCancellationRequested)
        {
          try
          {
            var msg = RedisHelper.BRPop(5, CacheKey);
            try
            {
              if (string.IsNullOrEmpty(msg)) continue;
              if (!Process(msg))
              {
                //加入错误处理队列,可以在后台写功能手动处理
                RedisHelper.LPush(CacheKey + "_err", msg);
              }
            }
            catch (Exception exp)
            {
              //加入错误处理队列,可以在后台写功能手动处理
              RedisHelper.LPush(CacheKey + "_err", msg);
              logger.LogError(exp, "RedisMQConsumer Execute error");
            }
          }
          catch
          {
            //网络可能中断
            await Task.Delay(TimeSpan.FromSeconds(5), stoppingToken);
          }
            
        }
      }, stoppingToken);
    }

    protected abstract bool Process(string message);
  }

然后就可以继承RedisMQConsumer,编写实际逻辑:

  public class AddOrderMQConsumer : RedisMQConsumer
  {
    public AddOrderMQConsumer(ILogger<RedisMQConsumer> logger) : base(logger)
    {
    }
    protected override string CacheKey => "addOrder";
    protected override bool Process(string message)
    {
      var order = JsonSerializer.Deserialize<Order>(message);
      //处理逻辑
      return true;
    }
  }

发布消息只是往队列中添加项:

RedisHelper.LPush("addOrder", order);

最后把消费服务添加到startup.cs中:

    public void ConfigureServices(IServiceCollection services)
    {
      //redis配置
      RedisHelper.Initialization(new CSRedis.CSRedisClient(Configuration.GetConnectionString("redis")));
      
      //redis消息队列消费服务,放在redis配置下方
      services.AddHostedService<AddOrderMQConsumer>();
    }

经测试,还算稳定,小并发项目可以使用。

到此这篇关于Asp.net core中RedisMQ的简单应用实现的文章就介绍到这了,更多相关Asp.net core RedisMQ内容请搜索真格学网以前的文章或继续浏览下面的相关文章希望大家以后多多支持真格学网!

您可能感兴趣的文章:.Net使用RabbitMQ即时发消息Demo.net msmq消息队列实例详解RabbitMQ .NET消息队列使用详解

  • 本文相关:
  • http协议下用web service上传大文件的解决方案
  • vs2012实现简单登录界面
  • .net core中比较两个文件内容是否相同的最快方法
  • asp.net mvc5网站开发之总体概述(一)
  • subsonic3.0插件更新字符串过长引发的异常修复方法
  • asp.net中for和do循环语句用法分享
  • asp.net 在global中拦截404错误的实现方法
  • asp.net取得所有颜色值示例
  • asp.net下oracle,sql server,access万能数据库通用类
  • jquery中如何获得服务器控件实现思路
  • asp.net 页面中<%#%>和<%%>的区别??
  • ASP.NET三层架构
  • ASP.Net中如何关闭当前页面
  • asp.net 中ascx是什么文件
  • asp与asp.net有何区别?
  • 在ASP,NET中如何加入音乐播放器?
  • 什么是ASP.net中的用户控件
  • .net core里面用什么代替System.Web.Service
  • asp.net repeater 中怎么获取checkbox 选中行的数据?
  • 如何在ASP.NET中点击一个button控件就可以跳转到另一个页面
  • asp.net中C# "不支持给定路径的格式"高手指导
  • ASP.net中的 <ItemTemplate>是什么意思
  • 在ASP.NET中Global.asax从哪里添加
  • ASP.NET中WEB.config连接网络服务器SQL 2005数据库,代码...
  • 在Asp.Net中Ajax如何调用后台方法?
  • ASP.NET中标准控件和html控件的区别?
  • ASP.Net中服务器控件的生命周期
  • asp.net 中 点击按钮弹出保存地址窗口,选择要保存的地址和输入...
  • 在ASP.NET网页中,有三类控件
  • asp.net中怎么实现刷新验证码?
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全基础应用实用技巧自学过程首页asp.net实用技巧.net使用rabbitmq即时发消息demo.net msmq消息队列实例详解rabbitmq .net消息队列使用详解vs2012实现简单登录界面.net core中比较两个文件内容是否相同的最快方法asp.net mvc5网站开发之总体概述(一)subsonic3.0插件更新字符串过长引发的异常修复方法asp.net中for和do循环语句用法分享asp.net 在global中拦截404错误的实现方法asp.net取得所有颜色值示例asp.net下oracle,sql server,access万能数据库通用类jquery中如何获得服务器控件实现思路未将对象引用设置到对象的实例 (java正则表达式 pattern和matcheasp.net(c#)网页跳转七种方法小结未能加载文件或程序集“xxx”或它asp.net“服务器应用程序不可用”asp.net中的几种弹出框提示基本实asp.net gridview 72般绝技asp.net生成excel并导出下载五种asp.net对路径"xxxxx"asp.net汉字转拼音和获取汉字首字asp.net 无限级分类实例代码gridview使用checkbox全选与单选采用js实asp.net利用jquery弹出层加载数据代码.net获取硬件信息_cpu序列号asp.net 生成静态页时的进度条显示asp.net mvc中razor常见的问题与解决方法手把手教你aspnetcore webapi数据验证的实.net core中使用httpclient的正确姿势解读asp.net密码强度验证代码实例分享c#中实现伪静态页面两种方式介绍
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved