InitQ组件来订阅消息
安装组件
先添加服务
/// <summary>
/// Redis 消息队列 启动服务
/// </summary>
public static class RedisInitMqSetup
{
public static void AddRedisInitMqSetup(this IServiceCollection services)
{
if (services == null) throw new ArgumentNullException(nameof(services));
services.AddInitQ(m =>
{
//时间间隔
m.SuspendTime = 5000;
//redis服务器地址
m.ConnectionString = "127.0.0.1:6379";
//对应的订阅者类,需要new一个实例对象,当然你也可以传参,比如日志对象
m.ListSubscribe = new List<IRedisSubscribe>() { new RedisSubscribe()};
//显示日志
m.ShowLog = false;
});
}
}
定义订阅者
public class RedisSubscribe : IRedisSubscribe
{
[Subscribe(RedisMqKey.Loging)]
private async Task SubRedisLoging(string msg)
{
Console.WriteLine($"队列{RedisMqKey.Loging} 消费到/接受到 消息:{msg}");
await Task.CompletedTask;
}
}
发布者
这里说一下,假设我们自定义了一个日志记录的方法,就是在txt里写数据,其实我现在也是这么用的,平时肯定会一边查一边写,如果并发高一下,肯定就会出现死锁或者异常的出现,那我们就可以把写日志放到消息队列里,缓冲一下,然后在写一个订阅者,专门来“盯着”队列,一有消息传过来,就写到日志文件里,这样就能很好的实现相应的目的。如果不缓冲下,有时候日志可能高达几万条,瞬间爆炸。
- 那说了这个小场景,接下来就简单的模拟一下吧
定义消息队列操作类与接口
如何发布消息与接收消息
[HttpGet]
[AllowAnonymous]
public async Task RedisMq()
{
var msg = "这里是一条日志";
await _redisBasketRepository.ListLeftPushAsync(RedisMqKey.Loging, msg);
}
手动获取
Task<RedisValue[]> ListRangeAsync(string redisKey);