本文主要介绍RedisMQ在Asp.net核心网的简单应用和实现。通过示例代码详细介绍,对大家的学习或工作有一定的参考学习价值。需要它的朋友将和边肖一起学习。
最近,一个外部项目使用了消息队列,最初是用rabbitmq实现的。但是因为部署到别人的服务器上,需要尽可能的简化,而且项目要访问redis缓存,所以尝试使用redis实现简单的消息队列。
使用redis作为消息队列有两种方式,一种是使用pub/sub,另一种是使用list结构用brpop消费。这两种方法各有特点,这里简单介绍一下:
发布/订阅模式支持多客户端消费,但不支持持久性,这意味着客户端断开连接期间发布的所有消息都将被丢弃。
列表与brpop配合使用,brpop默认不支持多客户端消费,支持持久化。这种多客户端消费模式可以通过伪装实现,比如下面的伪代码:
#步骤1将消息推送到队列
lpush listA消息
#步骤2,一个特殊的分发客户端取出消息并将其推送到每个子队列
var msg=brpop listA
lpush列表1消息
lpush列表2消息
.
#第3步:多个客户端使用来自相应队列的消息
var client1_msg=brpop listA1
var client2_msg=brpop listA2
.
消息丢失是不可取的,所以我选择了list,下一步就是选择合适的客户端。
Stackexchange。Redis是老式的客户端,但由于其复用方式,无法支持redis的阻塞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服务)
{
//redis配置
RedisHelper。初始化(新的CSRedis。CSRedisClient(配置。GetConnectionString(' redis '));
}
当然,您也可以通过依赖注入的方式添加CSRedisClient实例,这并不复杂。
队列在项目的几个地方使用,所以首先封装一个消费者服务:
公共抽象类RedisMQConsumer : background service
{
受保护的抽象字符串CacheKey { get}
受保护的ILoggerRedisMQConsumer记录器;
公共RedisMQConsumer(ILoggerRedisMQConsumer记录器)
{
this.logger=logger
}
受保护的覆盖任务执行异步(取消令牌停止超时)
{
返回任务。运行(异步()=
{
while(!停止肯。IsCancellationRequested)