我一直在修改这个聊天应用程序项目,我刚开始,但在连接到 2 个单独的 Redis 实例时遇到了一些麻烦。请注意,如果这是愚蠢的并且不是一个好的举动,请随时告诉我。
所以最初我有一个 Redis 实例为我的 Socket.IO 服务器处理 Pub/Sub,我在这里使用这个问题作为示例。
然后我想添加另一个 Redis 实例作为元数据的缓存/临时数据库,但是当我添加该代码并运行它时,我收到此错误。
错误:Redis 已连接/已连接
从这个错误中,我想我无法打开到 2 个不同服务器的两个单独连接?或者我可能做错了?
有没有办法可以正确配置它以与 2 个不同的服务器建立 2 个开放连接?
RedisClientFactory代码:(这连接到Redis数据库实例,端口6380)
此代码在 RedisModule 中调用/执行,然后在 AppModule 中调用/执行。
import { FactoryProvider } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
import Redis from 'ioredis';
export const redisClientFactory: FactoryProvider<Redis> = {
provide: 'RedisClient',
useFactory: (configService: ConfigService) => {
const redisInstance = new Redis({
port: configService.get('REDIS_DB_PORT'),
host: configService.get('REDIS_DB_HOST')
});
redisInstance.on('error', (e) => {
throw new Error(`Redis connection failed: ${e}`);
});
return redisInstance;
},
inject: [ConfigService]
};
RedisIOAdapter 代码:(这连接到另一个实例,pub/sub,端口 6379) 此代码在 main.ts 引导方法中被调用/执行。
import { IoAdapter } from '@nestjs/platform-socket.io';
import { createAdapter } from '@socket.io/redis-adapter';
import { Redis } from 'ioredis';
import { Server, ServerOptions } from 'socket.io';
import * as util from '../shared/util';
import { INestApplicationContext } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
const host = util.isLocal() ? 'localhost' : 'redis';
export class RedisIoAdapter extends IoAdapter {
protected redisAdapter;
constructor(private app: INestApplicationContext) {
super(app);
const configService = this.app.get(ConfigService);
const port: string = configService.get('REDIS_IO_PORT') || '';
if (!port || port.length <= 0 || !host) {
throw Error('Issue creating the Redis URL');
}
const pubClient = new Redis({
host,
port: Number(port)
});
const subClient = pubClient.duplicate();
pubClient.connect(); // <------
subClient.connect(); // <------
this.redisAdapter = createAdapter(pubClient, subClient);
}
createIOServer(port: number, options?: ServerOptions) {
const server = super.createIOServer(port, options) as Server;
server.adapter(this.redisAdapter);
return server;
}
}
经过更多尝试后,我相信这是一个库限制,因为一旦我将库切换到
node-redis
,它似乎就可以正常工作。
总结一下,如果您需要一次打开多个不同的 Redis 连接,那么应使用
node-redis
作为客户端库,而不是 ioredis
。
代码更改:
const client = createClient({
socket: {
host,
port
}
});