Nodejs项目中使用redis做socket.io的共享遇到问题,涉及socket.io-redis模块,求指点

Nodejs项目中使用redis做socket.io的共享遇到问题,涉及socket.io-redis模块,求指点

说正题,做的是一个聊天项目,想部署多个节点的node服务器,目前是用,pm2 进行的多进程 分布式。 目前我所知道的是:

var redisAdapter = require('socket.io-redis');
var redis = require('redis');
var pub = redis.createClient(config.redis_config.port, config.redis_config.host, {auth_pass: config.redis_config.auth_pass});
var sub = redis.createClient(config.redis_config.port, config.redis_config.host, {
    detect_buffers: true,
    auth_pass: config.redis_config.auth_pass
});
io.adapter(redisAdapter({
    host: config.redis_config.host,
    port: config.redis_config.port,
    pubClient: pub,
    subClient: sub
}));

不过这个不太好用,总是在启动的时候报on_error的错误,不能连接redis。

但是之前用的redis共享内存中的数据的时候就没问题


2 回复

当然可以。根据你的描述,你在使用 socket.io-redis 模块时遇到了连接 Redis 的问题。以下是一些可能的原因及解决方案,并附上一些示例代码来帮助你更好地理解和解决这个问题。

问题分析

  1. 配置错误:确保 config.redis_config 中的配置信息(如端口、主机名、密码)是正确的。
  2. Redis 服务未运行:确保 Redis 服务已经正确安装并正在运行。
  3. 客户端创建错误:确保 pubClientsubClient 的创建没有错误。

解决方案

示例代码

const io = require('socket.io')(server);
const redisAdapter = require('socket.io-redis');

// 确保配置正确
const config = {
    redis_config: {
        port: 6379,
        host: 'localhost',
        auth_pass: 'your_password'
    }
};

// 创建 Redis 客户端
const redis = require('redis');
const pub = redis.createClient(config.redis_config.port, config.redis_config.host, { auth_pass: config.redis_config.auth_pass });
const sub = redis.createClient(config.redis_config.port, config.redis_config.host, {
    detect_buffers: true,
    auth_pass: config.redis_config.auth_pass
});

// 捕获错误事件
pub.on('error', (err) => {
    console.error(`Redis Pub Client Error: ${err}`);
});
sub.on('error', (err) => {
    console.error(`Redis Sub Client Error: ${err}`);
});

// 设置适配器
io.adapter(redisAdapter({
    host: config.redis_config.host,
    port: config.redis_config.port,
    pubClient: pub,
    subClient: sub
}));

// 监听错误事件
io.on('connection', (socket) => {
    socket.on('error', (err) => {
        console.error(`Socket.IO Error: ${err}`);
    });
});

console.log('Socket.IO is now running with Redis adapter.');

关键点解释

  1. 配置检查:确保 config.redis_config 中的信息正确无误。
  2. 错误处理:为 Redis 客户端添加错误处理机制,以便在出现问题时能及时发现并调试。
  3. 适配器设置:使用 redisAdapter 方法将 Redis 配置传递给 Socket.IO 适配器。

进一步调试

  • 日志输出:增加更多的日志输出,以查看具体的错误信息。
  • 手动测试:尝试使用 redis-cli 或其他工具手动连接 Redis 服务器,确认 Redis 服务是否正常运行。

通过以上步骤,你应该能够找到并解决连接 Redis 的问题。希望这些建议对你有所帮助!


在使用 socket.io-redis 模块进行 socket.io 的共享时,如果遇到连接 Redis 失败的问题,可以检查以下几个方面:

  1. Redis 服务是否正常运行:确保你的 Redis 服务正在运行,并且可以被 Node.js 服务器访问。

  2. 配置参数是否正确:检查你的 Redis 配置参数(如 host, port, auth_pass)是否正确无误。

  3. 错误处理:确保你已经正确地处理了 Redis 客户端的错误事件。

以下是一个示例代码,展示了如何设置 socket.io-redis 模块,并添加错误处理机制:

const io = require('socket.io')(server);
const redisAdapter = require('socket.io-redis');

const redisConfig = {
    host: '127.0.0.1',
    port: 6379,
    auth_pass: 'your_redis_password'
};

const pub = redis.createClient(redisConfig.port, redisConfig.host, { auth_pass: redisConfig.auth_pass });
const sub = redis.createClient(redisConfig.port, redisConfig.host, { detect_buffers: true, auth_pass: redisConfig.auth_pass });

pub.on('error', (err) => console.log('Publisher Client Error: ', err));
sub.on('error', (err) => console.log('Subscriber Client Error: ', err));

io.adapter(redisAdapter({
    pubClient: pub,
    subClient: sub
}));

console.log('Socket.IO is now listening for connections...');

解释

  • Redis 客户端配置:确保 Redis 客户端配置正确,包括主机名、端口和密码。
  • 错误处理:为 pubsub 客户端添加了错误处理函数,以便在发生错误时打印错误信息。
  • 适配器配置:使用 redisAdapter 将 Redis 配置传递给 socket.io 适配器。

通过这些步骤,你可以更好地调试并解决连接 Redis 时可能遇到的问题。如果仍然有问题,请检查 Redis 日志或网络配置以进一步排查原因。

回到顶部