@63pokupki/nodejs-common
Version:
Common nodejs functionality
163 lines • 6.94 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.CacheSys = void 0;
const util_1 = require("util");
/**
* Система кеширования
*/
class CacheSys {
constructor(ctx) {
this.ctx = ctx;
this.errorSys = ctx.sys.errorSys;
this.userSys = ctx.sys.userSys;
if (ctx.infrastructure.redis) {
this.redisSys = ctx.infrastructure.redis;
}
else {
this.errorSys.error('db_redis', 'Отсутствует подключение к redis');
}
}
/**
* Авто кеширование для встраивания в функцию
* @param sKey - Ключ кеша
* @param iTimeSec - Время кеширования
* @param callback - функция получающая данные из БД
*/
async autoCache(sKey, iTimeSec, callback) {
let bCache = false; // Наличие кеша
let sCache = null;
let out = null;
if (this.ctx.sys.bCache) { // Пробуем получить данные из кеша
sCache = await this.redisSys.get(sKey);
if (sCache) {
bCache = true;
this.errorSys.devNotice(sKey, 'Значение взято из кеша');
}
}
if (!bCache) { // Если значения нет в кеше - добавляем его в кеш
out = await callback();
if (out && ((0, util_1.isObject)(out) || Array.isArray(out))) {
this.redisSys.set(sKey, JSON.stringify(out), iTimeSec);
}
else {
this.errorSys.devNotice(sKey, 'Не удалось посместить значение в кеш');
}
}
if (bCache) { // Если значение взято из кеша - отдаем его в ответ
out = JSON.parse(sCache);
}
return out;
}
/**
* Авто кеширование строки для встраивания в функцию
* @param sKey - Ключ кеша
* @param iTimeSec - Время кеширования
* @param callback - функция получающая данные из БД
*/
async autoCacheStr(sKey, iTimeSec, callback) {
let bCache = false; // Наличие кеша
let sCache = null;
let out = null;
if (this.ctx.sys.bCache) { // Пробуем получить данные из кеша
sCache = await this.redisSys.get(sKey);
if (sCache) {
bCache = true;
this.errorSys.devNotice(sKey, 'Значение взято из кеша');
}
}
if (!bCache) { // Если значения нет в кеше - добавляем его в кеш
out = await callback();
if (out && !Number(out) && String(out)) {
this.redisSys.set(sKey, String(out), iTimeSec);
}
else {
this.errorSys.devNotice(sKey, 'Не удалось посместить значение в кеш, значение не является строкой');
}
}
if (bCache) { // Если значение взято из кеша - отдаем его в ответ
out = sCache;
}
return out;
}
/**
* Авто кеширование int переменной для встраивания в функцию
* @param sKey - Ключ кеша
* @param iTimeSec - Время кеширования
* @param callback - функция получающая данные из БД
*/
async autoCacheInt(sKey, iTimeSec, callback) {
let bCache = false; // Наличие кеша
let sCache = null;
let out = null;
if (this.ctx.sys.bCache) { // Пробуем получить данные из кеша
sCache = await this.redisSys.get(sKey);
if (sCache) {
bCache = true;
this.errorSys.devNotice(sKey, 'Значение взято из кеша');
}
}
if (!bCache) { // Если значения нет в кеше - добавляем его в кеш
out = Number(await callback());
if (out || out === 0) {
this.redisSys.set(sKey, String(out), iTimeSec);
}
else {
this.errorSys.devWarning(sKey, `Неверный тип, должен быть number => ${out}`);
}
}
if (bCache) { // Если значение взято из кеша - отдаем его в ответ
out = Number(sCache);
}
return out;
}
/**
* Авто кеширование ID переменной для встраивания в функцию
* @param sKey - Ключ кеша
* @param iTimeSec - Время кеширования
* @param callback - функция получающая данные из БД
*/
async autoCacheID(sKey, iTimeSec, callback) {
let bCache = false; // Наличие кеша
let sCache = null;
let out = null;
if (this.ctx.sys.bCache) { // Пробуем получить данные из кеша
sCache = await this.redisSys.get(sKey);
if (sCache) {
bCache = true;
this.errorSys.devNotice(sKey, 'Значение взято из кеша');
}
}
if (!bCache) { // Если значения нет в кеше - добавляем его в кеш
out = Number(await callback());
if (out || out > 0) {
this.redisSys.set(sKey, String(out), iTimeSec);
}
else {
this.errorSys.devWarning(sKey, `Неверный тип, должен быть number => ${out}`);
}
}
if (bCache) { // Если значение взято из кеша - отдаем его в ответ
out = Number(sCache);
}
return out;
}
/**
* Очистить кеш редиса
* @param sKey
*/
async clearCache(sKey) {
if (sKey.includes('*')) { // Если передано регулярное выражение
await this.redisSys.clear(sKey);
// console.log('clearCache-pattern>>>', sKey);
}
else { // Если имеется точное совпадение
const kRedisCache = await this.redisSys.redisScan.get(sKey);
// console.log('clearCache-one>>>', sKey, kRedisCache);
if (kRedisCache) {
await this.redisSys.del([kRedisCache]);
}
}
}
}
exports.CacheSys = CacheSys;
//# sourceMappingURL=CacheSys.js.map