Код IT
← Каталог

Redis - хранилище ключ-значение в памяти — Шаг 4. Интеграция в приложение (Node.js, пример кэширования API-ответа)

Фрагмент из «Redis - хранилище ключ-значение в памяти»: Шаг 4. Интеграция в приложение (Node.js, пример кэширования API-ответа).

JavaScript part-01.js
const Redis = require('ioredis');

// Подключение с учётом ACL
const redis = new Redis({
  host: '127.0.0.1',
  port: 6379,
  username: 'appuser',
  password: 'Str0ngP@ss',
  // Отказоустойчивость: автоматическое переподключение
  retryStrategy(times) {
    const delay = Math.min(times * 50, 2000);
    return delay;
  },
  // Таймауты (защита от зависаний)
  connectTimeout: 3000,
  commandTimeout: 2000,
});

// Функция-обёртка для кэширования
async function cacheGet(key, fetchFn, ttl = 300) {
  try {
    // Шаг 1: Попытка чтения из кэша
    const cached = await redis.get(key);
    if (cached) {
      console.log(`[CACHE HIT] ${key}`);
      return JSON.parse(cached);
    }

    // Шаг 2: Вычисление (запрос к БД, внешнему API и т.п.)
    console.log(`[CACHE MISS] ${key}`);
    const data = await fetchFn();

    // Шаг 3: Сохранение в кэш (только если данные получены)
    if (data !== undefined && data !== null) {
      await redis.set(key, JSON.stringify(data), 'EX', ttl);
    }

    return data;
  } catch (err) {
    // При ошибке Redis — прозрачно работаем без кэша
    console.warn(`[CACHE ERROR] ${err.message}`);
    return fetchFn();
  }
}

module.exports = { redis, cacheGet };
const Redis = require('ioredis');

// Подключение с учётом ACL
const redis = new Redis({
  host: '127.0.0.1',
  port: 6379,
  username: 'appuser',
  password: 'Str0ngP@ss',
  // Отказоустойчивость: автоматическое переподключение
  retryStrategy(times) {
    const delay = Math.min(times * 50, 2000);
    return delay;
  },
  // Таймауты (защита от зависаний)
  connectTimeout: 3000,
  commandTimeout: 2000,
});

// Функция-обёртка для кэширования
async function cacheGet(key, fetchFn, ttl = 300) {
  try {
    // Шаг 1: Попытка чтения из кэша
    const cached = await redis.get(key);
    if (cached) {
      console.log(`[CACHE HIT] ${key}`);
      return JSON.parse(cached);
    }

    // Шаг 2: Вычисление (запрос к БД, внешнему API и т.п.)
    console.log(`[CACHE MISS] ${key}`);
    const data = await fetchFn();

    // Шаг 3: Сохранение в кэш (только если данные получены)
    if (data !== undefined && data !== null) {
      await redis.set(key, JSON.stringify(data), 'EX', ttl);
    }

    return data;
  } catch (err) {
    // При ошибке Redis — прозрачно работаем без кэша
    console.warn(`[CACHE ERROR] ${err.message}`);
    return fetchFn();
  }
}

module.exports = { redis, cacheGet };