gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 21:55:05 25 4
gpt4 key购买 nike

这是我的代码,使用 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)
})
})

})

关于node.js - 如何在socket.io中重用redis连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5739357/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com