InitQ组件来订阅消息

安装组件

先添加服务

  1. /// <summary>
  2. /// Redis 消息队列 启动服务
  3. /// </summary>
  4. public static class RedisInitMqSetup
  5. {
  6. public static void AddRedisInitMqSetup(this IServiceCollection services)
  7. {
  8. if (services == null) throw new ArgumentNullException(nameof(services));
  9. services.AddInitQ(m =>
  10. {
  11. //时间间隔
  12. m.SuspendTime = 5000;
  13. //redis服务器地址
  14. m.ConnectionString = "127.0.0.1:6379";
  15. //对应的订阅者类,需要new一个实例对象,当然你也可以传参,比如日志对象
  16. m.ListSubscribe = new List<IRedisSubscribe>() { new RedisSubscribe()};
  17. //显示日志
  18. m.ShowLog = false;
  19. });
  20. }
  21. }

定义订阅者

  1. public class RedisSubscribe : IRedisSubscribe
  2. {
  3. [Subscribe(RedisMqKey.Loging)]
  4. private async Task SubRedisLoging(string msg)
  5. {
  6. Console.WriteLine($"队列{RedisMqKey.Loging} 消费到/接受到 消息:{msg}");
  7. await Task.CompletedTask;
  8. }
  9. }

发布者

这里说一下,假设我们自定义了一个日志记录的方法,就是在txt里写数据,其实我现在也是这么用的,平时肯定会一边查一边写,如果并发高一下,肯定就会出现死锁或者异常的出现,那我们就可以把写日志放到消息队列里,缓冲一下,然后在写一个订阅者,专门来“盯着”队列,一有消息传过来,就写到日志文件里,这样就能很好的实现相应的目的。如果不缓冲下,有时候日志可能高达几万条,瞬间爆炸。

  • 那说了这个小场景,接下来就简单的模拟一下吧

定义消息队列操作类与接口

如何发布消息与接收消息

  1. [HttpGet]
  2. [AllowAnonymous]
  3. public async Task RedisMq()
  4. {
  5. var msg = "这里是一条日志";
  6. await _redisBasketRepository.ListLeftPushAsync(RedisMqKey.Loging, msg);
  7. }

手动获取

  1. Task<RedisValue[]> ListRangeAsync(string redisKey);