const redis = require('redis'); const config = require('../../config.json'); const Logger = require('../../lib/Logger'); const path = require('path'); class RedisClient { constructor() { // node-redis v4 必须使用 socket 或 url,顶层 host/port 会被忽略并默认连 127.0.0.1:6379 const clientOptions = { socket: { host: config.redis.host, port: config.redis.port } }; if (config.redis.password) { clientOptions.password = config.redis.password; } this.client = redis.createClient(clientOptions); this.logger = new Logger(path.join(__dirname, '../../logs/Redis.log'), 'INFO'); this.logger.info(`Redis 目标:${config.redis.host}:${config.redis.port}`); // 处理连接错误 this.client.on('error', (err) => { this.logger.error(`Redis连接出错:${err?.message || err?.stack || err}`); }); // 确保连接成功 this.client.on('connect', () => { this.logger.info('Redis连接成功!'); }); // 在连接建立时标记为已连接状态 this.client.on('ready', () => { this.logger.info('Redis客户端已就绪!'); }); // 在客户端关闭时处理事件 this.client.on('end', () => { this.logger.warn('Redis客户端连接已关闭!'); }); } // 获取 Redis 客户端实例 getClient() { if (!this.client.isOpen) { this.client.connect().catch((err) => { this.logger.error(`重新连接Redis时出错:${err?.message || err?.stack || err}`); }); } return this.client; } } const Redis = new RedisClient().getClient(); module.exports = Redis;