问题描述
这是我使用socket.io作为WebSocket并使用pub/sub redis后端的代码.
Here is my code using socket.io as WebSocket and backend with 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个连接.看起来不太好.
Every new io request will create new redis connection. If someone open browser with 100 tabs then the redis client will open 100 connections. It doesn't look nice.
如果cookie相同,是否可以重用redis连接?因此,如果有人打开许多浏览器选项卡,也将其视为打开1"连接.
Is it possible to reuse redis connection if the cookies are same?So if someone open many browser tabs also treat as open 1 connection.
推荐答案
实际上,如果要在连接"事件上实例化客户端,则只为每个连接创建一个新的Redis客户端.创建聊天系统时,我更喜欢创建三个Redis客户端.一种用于发布,订阅,另一种用于将值存储到Redis中.
Actually you are only creating a new redis client for every connection if you are instantiating the client on the "connection" event. What I prefer to do when creating a chat system is to create three redis clients. One for publishing, subscribing, and one for storing values into 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连接?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!