如何使用NODEJS+REDIS开发一个消息队列

摘要:
队列是指通过队列进行通信的应用程序。队列的使用消除了接收和发送应用程序同时执行的要求。其中,比较成熟的MQ产品是IBMWEBSPHEREMQ。以上介绍仍然来自百度百科。与当前流行的MQ相比,有两种消息队列产品:ActiveMQ和RabbitMQ。RabbitMQ拥有每秒10000次的性能,而REDIS的官方压力测试值在70000到80000之间,并且取消了网络IO操作。事实上,我估计每秒并发操作的数量为20000到30000次,但对于一般应用程序来说应该足够了。Redis如何支持消息队列?

作者: RobanLee

原创文章,转载请注明: 萝卜李 http://www.robanlee.com

MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们>。消 息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术。排队指的是应用程序通过 队列来通信。队列的使用除去了接收和发送应用程序同时执行的要求。其中较为成熟的MQ产品有IBM WEBSPHERE MQ。

以上介绍仍旧来自百度百科.

消息队列产品对比

目前比较流行的MQ有2种,ActiveMQ 以及 RabbitMQ , RabbitMQ性能号称能够达到每秒10000,而REDIS官方的压力测试值在7-8万之间,而且是去掉了网络IO操作,真实情况我估计在每秒2-3万的并发操作,但这个数目对于一般的应用应该足够了.

Redis如何支持消息队列?

在新版本的redis v2.6以上以及以上版本开始支持 subscribe 以及 publish 操作,  subscribe订阅一个频道,publish可以像频道广播消息. 这个机制最老的应用应该是算是聊天室了.

如何使用NODEJS+REDIS开发一个消息队列第1张

Sub/Pub 模式固然很好用,但是同样有一个问题,就是如果有多个人订阅了同一频道,而这个频道的数据只能被一个接收方处理,不能够重复处理,这时该怎么办?

解决方法有2种,

1. publish  将数据写入到一个list or sorted list 队列,写完成后开始给终端广播消息,告诉大家,有新的数据等待处理,这个时候,谁能pop到数据,就是谁处理,这个操作是原子性的,也就是说不会被重复处理.

2. 使用阻塞模式, redis提供了blpop brpop这种操作,也就是一直阻塞一个队列,直到有数据来. 这种模式保证了数据的原子性,而且使应用程序可以支持分布式多台机器部署.

Sub/Pub模式 (sub.js):

var redis = require("redis");
var client = redis.createClient(6379, '127.0.0.1', {connect_timeout: 1});

//订阅一个频道
var sub = function(c) {
    var c = c || 'roban:test:channel';
    client.subscribe(c,function(e){
        console.log('starting subscribe channel:'+c);
    });
};

//订阅一个频道
sub();

//处理错误,如果出现错误,或者服务器断开了链接,等待恢复时,继续订阅这个频道
client.on('error', function(error) {
    console.log(error);
    sub();
});


//订阅处理函数
client.on('message',function(err,response){
    console.log(response);
});

打开redis命令行,输入以下命令:

publish roban:test:channel hello

发布这条信息后,sub端会输出以下信息:

Robans-Pro:node robanlee$ node demo.js 
starting subscribe channel:roban:test:channel
hello

免责声明:文章转载自《如何使用NODEJS+REDIS开发一个消息队列》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇C# JArray与JObject 的使用Selenium2+python自动化19-单选框和复选框(radiobox、checkbox)【转载】下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

redis 参数配置总结

redis.conf 配置项说明如下 1. Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程   daemonize no 2. 当Redis以守护进程方式运行时,Redis默认会把pid写入 /var/run/redis.pid 文件,可以通过pidfile指定pidfile /var/run/redis.pi...

下一代GNU/Linux显示服务Wayland 1.12正式发布

导读 最近,Bryce Harrington很高兴地宣布了“面向GNU/Linux操作系统的Wayland 1.12.0显示服务已正式发布”的消息。与它一同到来的,还有Weston 1.12.0合成器。 Wayland 1.12和Weston 1.12的开发工作早已开始,一个月前就就想公测者们放出了首个Alpha编译版本。最终编译版本中,加入了许多可以...

Django项目中关于redis包版本的坑

1.环境 python:3.6 django:1.11.8 redis:3.2.1 2.遇到的问题 报错:redis.exceptions.DataError: Invalid input of type: 'UserInfo'. Convert to a byte, string or number first. 3.原因 不指定安装版本时,pip i...

Wpf发送接收 win32消息

#region WPF发送和接收win32消息 public const int WM_GETTEXT = 0x0D; public const int WM_SETTEXT = 0x0C; public const int WM_SIZEING = 0x0214; public const...

Redis数据结构详解之Zset(五)

序言Zset跟Set之间可以有并集运算,因为他们存储的数据字符串集合,不能有一样的成员出现在一个zset中,但是为什么有了set还要有zset呢?zset叫做有序集合,而set是无序的,zset怎么做到有序的呢?就是zset的每一个成员都有一个分数与之对应,并且分数是可以重复的。有序集合的增删改由于有啦排序,执行效率就是非常快速的,即便是访问集合中间的数据...

Redis Zset类型跳跃表算法实现(JAVA)

Redis 有序集合类型(zset) 底层核心实现的机制就是跳跃表   最近公司搞了技术分享的活动,正好快到我了,最近在研究Redis就说说redis实现的原理吧. 发现还是晚上脑子比较好使,建议看代码时候边看边画图 推荐画图工具 http://draw.io/ 首先定义一个双向链表的类 双向链表的流程图  跳跃表的结构图 跳跃表查找的过程 跳跃...