Asp.net core中-locvps-RedisMQ的简单应用实现

这篇文章首要介绍了Asp.net core中RedisMQ的简略应用完成,文中经过示例代码介绍的非常详细,对我们的学习或许作业具有一定的参阅学习价值,需求的朋友们下面随着小编来一同学习学习吧

最近一个外部的项目,运用到了音讯行列,本来是用rabbitmq完成的,可是因为是布置到别人家的服务器上,想尽量简化一些,项目中本来也要接入了locvps-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 ILoggerlogger;

public RedisMQConsumer(ILoggerlogger)
{
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(ILoggerlogger) : base(logger)
{
}
protected override string CacheKey => “addOrder”;
protected override bool Process(string message)
{
var order = JsonSerializer.Deserialize(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();
}

经测验,还算安稳,小并发项目能够运用。

共有 0 条评论

发表评论

邮箱地址不会被公开。 必填项已用*标注