rwadurian/backend/services/reward-service/src/infrastructure/redis/redis.service.ts

65 lines
1.7 KiB
TypeScript

import { Injectable, OnModuleDestroy, Logger } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
import Redis from 'ioredis';
@Injectable()
export class RedisService implements OnModuleDestroy {
private readonly logger = new Logger(RedisService.name);
private readonly client: Redis;
constructor(private readonly configService: ConfigService) {
const password = this.configService.get<string>('REDIS_PASSWORD');
this.client = new Redis({
host: this.configService.get<string>('REDIS_HOST') || 'localhost',
port: this.configService.get<number>('REDIS_PORT') || 6379,
password: password || undefined,
});
this.client.on('connect', () => {
this.logger.log('Connected to Redis');
});
this.client.on('error', (err) => {
this.logger.error('Redis error:', err);
});
}
async onModuleDestroy() {
await this.client.quit();
}
getClient(): Redis {
return this.client;
}
async get(key: string): Promise<string | null> {
return this.client.get(key);
}
async set(key: string, value: string, ttlSeconds?: number): Promise<void> {
if (ttlSeconds) {
await this.client.setex(key, ttlSeconds, value);
} else {
await this.client.set(key, value);
}
}
async del(key: string): Promise<void> {
await this.client.del(key);
}
async exists(key: string): Promise<boolean> {
const result = await this.client.exists(key);
return result === 1;
}
async setJson(key: string, value: any, ttlSeconds?: number): Promise<void> {
await this.set(key, JSON.stringify(value), ttlSeconds);
}
async getJson<T>(key: string): Promise<T | null> {
const value = await this.get(key);
return value ? JSON.parse(value) : null;
}
}