如何重用socket.io中的Redis连接?

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

var io = io.listen(server),

buffer = [];

var redis = require("redis");

var subscribe = redis.createClient(); **<--- open new connection overhead**

io.on('connection', function(client) {

console.log(client.request.headers.cookie);

subscribe.get("..", function (err, replies) {

});

subscribe.on("message",function(channel,message) {

var msg = { message: [client.sessionId, message] };

buffer.push(msg);

if (buffer.length > 15) buffer.shift();

client.send(msg);

});

client.on('message', function(message){

});

client.on('disconnect', function(){

subscribe.quit();

});

});

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

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

回答:

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

例如:

var socketio = require("socket.io")

var redis = require("redis")

// redis clients

var store = redis.createClient()

var pub = redis.createClient()

var sub = redis.createClient()

// ... application paths go here

var socket = socketio.listen(app)

sub.subscribe("chat")

socket.on("connection", function(client){

client.send("welcome!")

client.on("message", function(text){

store.incr("messageNextId", function(e, id){

store.hmset("messages:" + id, { uid: client.sessionId, text: text }, function(e, r){

pub.publish("chat", "messages:" + id)

})

})

})

client.on("disconnect", function(){

client.broadcast(client.sessionId + " disconnected")

})

sub.on("message", function(pattern, key){

store.hgetall(key, function(e, obj){

client.send(obj.uid + ": " + obj.text)

})

})

})

以上是 如何重用socket.io中的Redis连接? 的全部内容, 来源链接: utcz.com/qa/412418.html

回到顶部