77 lines
1.8 KiB
JavaScript

import { createClient } from 'redis';
import log4js from 'log4js';
import config from '../config.js';
const logger = log4js.getLogger('Redis');
logger.level = config.server.logLevel;
class RedisServer {
constructor() {
const url = config.database.redis.url || `redis://${config.database.redis.host}:${config.database.redis.port}`;
this.client = createClient({
url,
password: config.database.redis.password || undefined,
});
this.client.on('error', (err) => {
logger.error('Redis Client Error', err);
});
this.connected = false;
}
async connect() {
if (this.connected) return;
logger.info('Connecting to Redis...');
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);
}
async getKeysByPattern(pattern) {
await this.connect();
const keys = [];
let cursor = '0';
do {
const result = await this.client.scan(cursor, {
MATCH: pattern,
COUNT: 100,
});
cursor = result.cursor;
keys.push(...result.keys);
} while (cursor !== '0');
return keys;
}
}
const redisServer = new RedisServer();
export { RedisServer, redisServer };