77 lines
1.8 KiB
JavaScript
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 };
|