69 lines
1.6 KiB
JavaScript
69 lines
1.6 KiB
JavaScript
import { createClient } from 'redis';
|
|
import log4js from 'log4js';
|
|
import dotenv from 'dotenv';
|
|
|
|
dotenv.config();
|
|
|
|
const LOG_LEVEL = process.env.LOG_LEVEL || 'info';
|
|
const REDIS_URL = process.env.REDIS_URL;
|
|
const REDIS_HOST = process.env.REDIS_HOST || '127.0.0.1';
|
|
const REDIS_PORT = process.env.REDIS_PORT || 6379;
|
|
const REDIS_PASSWORD = process.env.REDIS_PASSWORD || undefined;
|
|
|
|
const logger = log4js.getLogger('Redis');
|
|
logger.level = LOG_LEVEL;
|
|
|
|
class RedisServer {
|
|
constructor() {
|
|
const url = REDIS_URL || `redis://${REDIS_HOST}:${REDIS_PORT}`;
|
|
|
|
this.client = createClient({
|
|
url,
|
|
password: REDIS_PASSWORD,
|
|
});
|
|
|
|
this.client.on('error', (err) => {
|
|
logger.error('Redis Client Error', err);
|
|
});
|
|
|
|
this.connected = false;
|
|
}
|
|
|
|
async connect() {
|
|
if (this.connected) return;
|
|
await this.client.connect();
|
|
this.connected = true;
|
|
logger.info('Connected to Redis');
|
|
}
|
|
|
|
async setKey(key, value, ttlSeconds) {
|
|
await this.connect();
|
|
const payload = typeof value === 'string' ? value : JSON.stringify(value);
|
|
if (ttlSeconds) {
|
|
await this.client.set(key, payload, { EX: ttlSeconds });
|
|
} else {
|
|
await this.client.set(key, payload);
|
|
}
|
|
}
|
|
|
|
async getKey(key) {
|
|
await this.connect();
|
|
const value = await this.client.get(key);
|
|
if (value == null) return null;
|
|
try {
|
|
return JSON.parse(value);
|
|
} catch {
|
|
return value;
|
|
}
|
|
}
|
|
|
|
async deleteKey(key) {
|
|
await this.connect();
|
|
await this.client.del(key);
|
|
}
|
|
}
|
|
|
|
const redisServer = new RedisServer();
|
|
|
|
export { RedisServer, redisServer };
|