㈠ 如何使用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/)