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

写在同一个链接上会出问题。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值