㈠ 如何使用NODEJS+REDIS开发一个消息队列
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可以像频道广播消息.
这个机制最老的应用应该是算是聊天室了.
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中使用缓存
Nodejs可以使用redis缓存。
Redis数据库采用极简的设计思想,最新版的源码包还不到2Mb。其在使用上也有别于一般的数据库。
node_redis
redis驱动程序多使用 node_redis此模块可搭载官方的 hiredis C 语言库 - 同样是非阻塞的,比使用JavaScript内置的解释器性能稍好。可选择将hiredis 与 redis 一同安装。
npm install hiredis redis
如果 hiredis 安装成功, node_redis 会默认使用 hiredis, 否则会使用JavaScript的解释器。
Redis的一个Key不仅可以对应一个String类型的值,还支持hashes, lists, sets, sorted sets, bitmaps等。
比如存/取一组Hash值,Redis中有两个对应的命令
HMSET key field value [field value ...]、
为一个Key一次设置多个哈希键/值, 多用于JSON对象的写入(序列化的SESSION)。
HGETALL key
读取一个Key的所有 哈希键/值,多用于JSON对象读取
这两个命令即是在NodeJS中存取JSON对象的关键,
下面是node_reids中对应的例子:
全选复制放进笔记var redis = require("redis"),
client = redis.createClient();
//写入JavaScript(JSON)对象
client.hmset('sessionid', { username: 'kris', password: 'password' }, function(err) {
console.log(err)
})
//读取JavaScript(JSON)对象
client.hgetall('sessionid', function(err, object) {
console.log(object)
})
㈢ 如何使用NODEJS+REDIS开发一个消息队列
redis本身就支持pub/sub模式,可以作为消息队列处理,参见 Command reference
按题主的场景,需要配置redis的持久化保存,否则可能会出现数据没有保存到mysql中的情形。
㈣ 如何使用NODEJS+REDIS开发一个消息队列
因为redis实现消息队列很简单!$this->redis->rPush($key, $val); // 右边入$this->redis->lPop($key); // 左边出
㈤ 想哭死了,怎么阿里云的发短信那接口,怎么用nodejs写
参考如下实例代码:
self.sendAliMessage = function(req,res){
var param = {
'Action' : 'SingleSendSms',
'SignName' : 'xxxx', //短信签名名称
'TemplateCode' : 'SMS_1635xxxx',
'RecNum' : '13564096???', //手机号
'ParamString' : JSON.stringify({"code":"9527"}),//验证码模板里的变量
'Version' : '2016-09-27',
'Format' : 'JSON',
'AccessKeyId' : ali_access_key_id,
'SignatureMethod' : 'HMAC-SHA1',
'SignatureVersion' : '1.0',
'SignatureNonce' : randomstr(9), //随机数
'Timestamp' : new Date().toISOString(),
};
param.Signature = sign.signForAliMessage(param, ali_access_key_secret);
var api_url = 'https://sms.aliyuncs.com/';
request.post({
url: api_url,
headers: {
'Content-Type':'application/x-www-form-urlencoded'
},
form:param
},function(err,response,data){
var result
data = JSON.parse(data);
if (!err && data.Model) {
result = res.returnData(200);
}else{
result = res.returnData(113);
}
res.send(result);
});
}
/*签名方法*/
sign.signForAliMessage = function(src_sign,access_key_secret){
var param , qstring = [];
var oa = Object.keys(src_sign).sort() , on = {};
for(var i=0;i<oa.length;i++){
on[oa] = src_sign[oa];
}
param = on;
for(var key in param){
qstring.push(encodeURIComponent(key)+'='+encodeURIComponent(param[key]));
}
qstring = qstring.join('&');
var StringToSign = 'POST'+'&'+encodeURIComponent('/')+'&'+encodeURIComponent(qstring);
access_key_secret = access_key_secret+'&';
var signature = crypto.createHmac('sha1', access_key_secret).update(new Buffer(StringToSign, 'utf-8')).digest('base64');
return signature;
}
㈥ 我用的nodejs,邮箱发送验证码功能在本地测试可以,在云服务器上为什么不行
云服务器上不允许你随便发邮件的,否则你想想,每个人都可以随便发邮件,你天天得收多少垃圾邮件。
nodejs代码加密,用Jshaman(http://www.jshaman.com/)