Кэширование в Node.js: Redis и альтернативы для ускорения приложений

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Кэширование в JavaScript (Node.js): Redis и другие

Кэширование — один из ключевых инструментов для повышения производительности веб-приложений на Node.js. Оно позволяет сократить время ответа сервера, снизить нагрузку на базы данных и внешние API, а также улучшить пользовательский опыт. В этой статье мы рассмотрим популярные библиотеки и подходы к кэшированию: от встроенных решений до мощного Redis.

Зачем нужно кэширование в Node.js?

Без кэширования каждый запрос к серверу может приводить к повторным вычислениям, запросам к БД или внешним сервисам. Это увеличивает время ответа и потребление ресурсов. Кэш хранит часто запрашиваемые данные в быстром хранилище (оперативная память или in-memory БД), что позволяет:

  • Ускорить ответы — чтение из памяти в 100-1000 раз быстрее, чем из диска.
  • Снизить нагрузку — база данных обрабатывает меньше запросов.
  • Сэкономить бюджет — меньше ресурсов на облачные сервисы.

1. Redis — промышленный стандарт

Redis — это высокопроизводительное in-memory хранилище данных, поддерживающее структуры данных (строки, хэши, списки, множества). Для Node.js используется пакет redis или ioredis.

Установка и подключение

npm install redis
const redis = require('redis');
const client = redis.createClient({
  url: 'redis://localhost:6379'
});

client.on('error', (err) => console.error('Redis Client Error', err));
client.connect();

Базовые операции

// Запись с TTL (время жизни)
await client.setEx('user:123', 3600, JSON.stringify({name: 'Alice', role: 'admin'}));

// Чтение
const cached = await client.get('user:123');
if (cached) {
  console.log('Из кэша:', JSON.parse(cached));
} else {
  // запрос к БД
}

Продвинутые возможности

  • Инвалидация по шаблону — удаление всех ключей с префиксом user:*.
  • Pub/Sub — уведомления об изменениях кэша между экземплярами.
  • Redis Cluster — горизонтальное масштабирование.

2. node-cache — in-memory кэш без внешних зависимостей

Для небольших проектов или прототипов подойдёт библиотека node-cache. Она работает в рамках одного процесса Node.js и не требует установки Redis.

Установка

npm install node-cache

Пример использования

const NodeCache = require('node-cache');
const myCache = new NodeCache({ stdTTL: 600, checkperiod: 120 });

// Сохраняем данные
myCache.set('posts:recent', postsData, 3600);

// Читаем
const cached = myCache.get('posts:recent');
if (cached) {
  return cached;
} else {
  const fresh = await fetchPostsFromDB();
  myCache.set('posts:recent', fresh);
  return fresh;
}

Особенности

  • Простая настройка TTL (time-to-live).
  • Автоматическая очистка устаревших записей.
  • Не подходит для распределённых систем (данные живут только в одном процессе).

3. memory-cache — лёгкая альтернатива

memory-cache — ещё один простой in-memory кэш для Node.js. Отличается минималистичным API.

const cache = require('memory-cache');

// Запись
cache.put('api:weather', weatherData, 300000); // 5 минут

// Чтение
const data = cache.get('api:weather');
if (!data) {
  // перезапрос
}

4. Стратегии кэширования

Выбор стратегии зависит от типа данных и требований к актуальности:

  • Cache-Aside (Lazy Loading) — приложение сначала проверяет кэш, при промахе загружает данные и сохраняет в кэш. Самый популярный подход.
  • Write-Through — данные записываются одновременно в кэш и БД. Гарантирует консистентность, но замедляет запись.
  • Write-Behind — данные сначала пишутся в кэш, затем асинхронно в БД. Быстрая запись, но риск потери данных.
  • Time-Based (TTL) — данные живут фиксированное

Рекомендаций