如何在socket.io中重用redis连接?

下面是我使用socket.io作为WebSocket并使用pub/sub redis作为后端的代码

var io=io.listen(服务器),
缓冲区=[];
var redis=需要(“redis”);
var subscribe=redis.createClient()**<--打开新的连接开销**
io.on('连接',功能(客户端){
log(client.request.headers.cookie);
subscribe.get(“…”)函数(err,reply){
});
subscribe.on(“消息”,功能(频道,消息){
var msg={message:[client.sessionId,message]};
buffer.push(msg);
如果(buffer.length>15)buffer.shift();
client.send(msg);
});
client.on('message',函数(message){
});
client.on('disconnect',function()){
订阅。退出();
});
});

每个新的io请求都将创建新的redis连接。如果有人打开带有100个选项卡的浏览器,那么redis客户端将打开100个连接。看起来不太好

如果cookie相同,是否可以重用redis连接?
因此,如果有人打开多个浏览器选项卡,也将其视为打开1个连接

实际上,如果要在“connection”事件上实例化客户机,则只需为每个连接创建一个新的redis客户机。创建聊天系统时,我更喜欢做的是创建三个redis客户端。一个用于发布、订阅,另一个用于将值存储到redis中

例如:

var socketio=require(“socket.io”)
var redis=需要(“redis”)
//redis客户端
var store=redis.createClient()
var pub=redis.createClient()
var sub=redis.createClient()
// … 应用程序路径位于此处
var socket=socketio.listen(应用程序)
订阅(“聊天”)
socket.on(“连接”,函数(客户端){
发送(“欢迎!”)
client.on(“消息”,函数(文本){
store.incr(“messageNextId”,函数(e,id){
hmset(“消息:+id,{uid:client.sessionId,text:text},函数(e,r){
发布(“聊天”,“消息:”+id)
})
})
})
client.on(“断开连接”,函数(){
client.broadcast(client.sessionId+“断开”)
})
sub.on(“消息”,功能(模式,键){
store.hgetall(键、功能(e、obj){
client.send(obj.uid+“:”+obj.text)
})
})
})

发表评论