express redis socket 消息提醒方案2:訂閱redis,推送消息

第二個方案

和上個區別在於服務器得到消息後主動推送給對應客戶端。

實現就是redis 訂閱事件,監聽message,得到發佈後分析,推送給指定鏈接的userid。

服務器區別代碼:

var redis_socket_sub=require('./redis_socket_sub.js')
//註冊 訂閱事件 用switch 分別事件
redis_socket_sub.init_sub(function(type,message){
	switch(type){
		case "message_pub":
			msg();
			break;
	}
	function msg(){
		var arr=message.split(':');
		//console.log(user)
		if(arr.length>1){
			//console.log(users);
			var user=users[arr[0]]
			if(user && user.emit){		
				//console.log(users[user[0]]);	
				console.log('userid:',arr[0],'存在')
				user.emit('message',{type:1,action:'message_number',
				data:arr[1]})
			}
		}
	}
});

在鏈接上後並獲取了user信息後添加到

users[socket.user.id]=socket;

在斷開後:

socket.on('disconnect',function(){
if(socket.user){
users[socket.user.id]=null;
}
//console.log('user',users)
console.log('close')
})


redis_socket_sub.js:

var redis   = require('redis');
var client  = redis.createClient('6379', '127.0.0.1');





//在ready回調內訂閱message_pub 
client.on('ready',function(){
	//訂閱消息	
	client.subscribe('message_pub',function(type){
		console.log('message_pub success ')
	});
})
//訂閱消息事件
exports.init_sub=function(call){	
	client.on("message", function (channel, message) {
	    console.log("channel="+channel+";message=" + message);
	    call(channel,message)
	});		
}

訂閱消息,message 監聽內調用回調call.

1、回調接收的值  也就是publish key value  時value的值是有要求的。

它的傳遞都是字符串,如果傳遞的是對象json 寫法需要特別注意:

 publish "rmcc" '{"type":"1","userId":"1","value":"3"}' 
一般的json中數字是不需要加雙引號的,但是redis中需要加上。

這樣回調裏纔可用JSON.parse(message)來解析成對象。

2、還有訂閱和查詢的redis 分別開兩個redis.createClient

寫在同一個鏈接上會出問題。


發佈了152 篇原創文章 · 獲贊 4 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章