import { Injectable, Logger, OnModuleDestroy, OnModuleInit } from '@nestjs/common' import { ConfigService } from '@nestjs/config' import Redis from 'ioredis' import { AllConfigs } from '@/config' @Injectable() export class RedisService extends Redis implements OnModuleInit, OnModuleDestroy { private readonly logger = new Logger(RedisService.name) public constructor( private readonly configService: ConfigService ) { super({ username: configService.get('redis.username', { infer: true }), host: configService.get('redis.host', { infer: true }), port: configService.get('redis.port', { infer: true }), password: configService.get('redis.password', { infer: true }), db: parseInt(configService.get('redis.db', { infer: true }),), maxRetriesPerRequest: 5, enableOfflineQueue: true }) } public onModuleInit() { const start = Date.now() this.on('connect', () => { this.logger.log('Redis connecting...') }) this.on('ready', () => { this.logger.log(`Redis connected in ${Date.now() - start}ms`) }) this.on('error', e => { this.logger.error('Redis connection error', { error: e.message || e }) }) this.on('close', () => { this.logger.warn('Redis connection closed') }) this.on('reconnecting', () => { this.logger.log('Redis reconnecting') }) } public async onModuleDestroy() { this.logger.log('Redis disconnecting...') try { await this.quit() this.logger.log('Redis disconnected') } catch (e) { this.logger.error('Redis disconnecting error', e) } } }