91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

RedisMQ如何在Asp.net項目中實現

發布時間:2020-12-09 15:25:21 來源:億速云 閱讀:332 作者:Leah 欄目:開發技術

本篇文章給大家分享的是有關RedisMQ如何在Asp.net項目中實現,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

使用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>();
    }

以上就是RedisMQ如何在Asp.net項目中實現,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

岳普湖县| 确山县| 英超| 长葛市| 武鸣县| 六盘水市| 监利县| 焦作市| 杭锦后旗| 灵丘县| 连山| 孝昌县| 南阳市| 汽车| 九寨沟县| 宁阳县| 友谊县| 吉木萨尔县| 台安县| 南阳市| 保定市| 太仓市| 丹寨县| 察哈| 新巴尔虎右旗| 陈巴尔虎旗| 平舆县| 延津县| 南漳县| 巴东县| 巴中市| 武宣县| 金阳县| 凤山县| 桂林市| 永修县| 锡林浩特市| 阳曲县| 区。| 五莲县| 甘谷县|