Redis消息队列(Message queues)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis消息队列(Message queues)相关的知识,希望对你有一定的参考价值。

参考技术A + 发布者订阅者模式:发布者生产消息放到队列里,多个监听队列的消费者都会收到同一份消息;即正常情况下每个消费者收到的消息应该都是一样的。

+ 生产者消费者模式(Producer/Consumer Mode):生产者生产消息放到队列里,多个消费者同时监听队列,谁先抢到消息谁就会从队列中取走消息;即对于每个消息只能被最多一个消费者拥有。

+ Producer调用redis的lpush往特定key里塞入消息,Consumer调用brpop去不断监听该key。当有多个consumers的时候,它会按照brpop调用的顺序分派消息,并非随机。

初识Message Queue之--基础篇

      之前我在项目中要用到消息队列相关的技术时,一直让Redis兼职消息队列功能,一个偶然的机会接触到了MSMQ消息队列。秉着技术还是专业的好为原则,对MSMQ进行了学习,以下是我个人的学习笔记。

一、什么是MSMQ

在我理解中,消息队列就是一个数据的容器,并且可以异步处理数据,提高数据的并发性。比如投递简历:用人单位就像是消息队列,在同一时间,可以接受大量的简历(数据)。然后等回公司了再一份一份的取出查看。

二、MSMQ功能启动(win 7为例)

      好多系统默认是不开启消息队列(MSMQ)的。故,我们要手动开启。具体流程为:打开控制面板-》程序和功能-》打开或关闭Windows功能(时间比较长)-》勾选Microsoft Message Queue(MSMQ)服务器;即可。如图所示:

1、技术分享技术分享

 

2、技术分享

3、技术分享

完成以上操作,MSMQ便正常启动了;

 三、创建一个消息队列(暂做了解,代码也可以创建,感觉代码更方便直观)

     我们通过打开计算机管理,就可以看到消息队列的内容了。(计算机管理打开方式:控制面板-》管理工具-》计算机管理)如图:

技术分享

      我们可以看出,系统给我们提供了四种队列,但是我们用户只能使用专用队列这一项。队列地址以private$\\开头。

      我们可以尝试创建一个专用队列,"右击"专用队列,再点击"新建",得到新增界面如下图。

技术分享

      对话框里面有一个事务性,说明MSMQ是支持事物提交,由于目前没有涉及到事物性,因此暂不讲解。

      我们起一个名为test的消息队列点击确定,我们便可以看到在右侧出现了一个名为test的队列。

技术分享

四、怎么样在.NET中使用MSMQ

      对于.NET来说,微软封装了操作MSMQ的类,MessageQueue ;该类需要引入命名空间System.Messaging;

      以下分模块介绍MessageQueue 中的主要方法:

1、创建MSMQ队列(Create)

 

            string path =".\\\\private$\\\\"+ "test";//设置消息队列路径
            if (!MessageQueue.Exists(path))//判断该路径是否存在
            {
                MessageQueue.Create(path);//如果不存在则创建
            }
            MessageBox.Show("ok");

 

 2、发送数据(Send)

1             string path = ".\\\\private$\\\\" + "test";//设置消息队列路径
2             MessageQueue msqs = new MessageQueue(path);//创建指定路径下的消息队列对象
3             msqs.Send("要发送的信息");
4             MessageBox.Show("成功");

3、接收数据(Receive)

            string path = ".\\\\private$\\\\" + "test";//设置消息队列路径
            MessageQueue msqs = new MessageQueue(path);//创建指定路径下的消息队列对象
            System.Messaging.Message mes =  msqs.Receive();//获取单条数据(如果没有数据,当前进程会被阻塞)
            string message = mes.Body.ToString();//获取Message内的内容
            MessageBox.Show(message);

注:Receive方法在没有数据接收时,会阻塞线程。因此,建议放在单独的线程中运行,以保证程序的稳定运行;

      Message是MSMQ的一个数据容器,其中数据存储在Body中。Body是一个已经被序列化的数据。故,在使用时要转换为相应的类型。

      以上是基础的MSMQ的使用方式,掌握上述技术,可以使用MSMQ进行简单的数据存储。之后有更高级的用法我再补充。谢谢!

 

以上是关于Redis消息队列(Message queues)的主要内容,如果未能解决你的问题,请参考以下文章

常用Message Queue对比

MQ (Message Queue) 消息队列

IPC - 消息队列(Message Queue)- 使用

IPC - 消息队列(Message Queue)- 使用

IPC - 消息队列(Message Queue)- 使用

IPC - 消息队列(Message Queue)- 使用