Кэширование в TypeScript: Redis и другие решения для Node.js

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

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

Начать курс

Кэширование в TypeScript: Redis и другие инструменты для Node.js

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

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

Без кэша каждый запрос к серверу может приводить к повторной обработке данных: чтению из БД, сложным вычислениям или обращению к внешним API. Кэш сохраняет результат первого вызова и отдаёт его при повторных запросах за миллисекунды. Основные сценарии:

  • Кэширование ответов от внешних сервисов (погода, курсы валют);
  • Хранение часто запрашиваемых данных (справочники, конфигурации);
  • Сокращение времени рендеринга страниц;
  • Ограничение числа запросов к БД.

Популярные библиотеки для кэширования в TypeScript

1. Redis (через ioredis)

Redis — in-memory хранилище данных, работающее как сервер. Для TypeScript лучший клиент — ioredis с полной поддержкой типов. Установка:

npm install ioredis
npm install -D @types/ioredis

Пример базового кэша с TTL (время жизни):

import Redis from 'ioredis';

const redis = new Redis({
    host: 'localhost',
    port: 6379,
});

// Сохраняем данные на 60 секунд
await redis.set('user:123', JSON.stringify({ name: 'Анна' }), 'EX', 60);

// Получаем данные
const cached = await redis.get('user:123');
if (cached) {
    const user = JSON.parse(cached);
    console.log(user.name); // Анна
}

Преимущества: распределённое хранение, автоматическое удаление ключей, поддержка сложных структур (списки, хеши). Недостатки: требуется запущенный сервер Redis, задержка на сетевой вызов.

2. node-cache (in-memory)

node-cache — простая библиотека для кэширования в памяти процесса. Не требует внешних зависимостей. Установка:

npm install node-cache
npm install -D @types/node-cache

Пример:

import NodeCache from 'node-cache';

const myCache = new NodeCache({ stdTTL: 120 }); // TTL по умолчанию 120 сек

// Сохраняем
myCache.set('config', { theme: 'dark', lang: 'ru' });

// Получаем
const config = myCache.get('config');
if (config) {
    console.log(config.theme); // dark
}

// Удаляем
myCache.del('config');

Подходит для небольших приложений, где не нужна синхронизация между серверами.

3. memory-cache

Ещё одна in-memory библиотека с минималистичным API. Отличается простотой и отсутствием зависимостей:

npm install memory-cache

Пример:

import cache from 'memory-cache';

cache.put('weather', { temp: 22, condition: 'sunny' }, 300_000); // 5 минут

const weather = cache.get('weather');
if (weather) {
    console.log(`Температура: ${weather.temp}°C`);
}

// Проверка наличия ключа
if (cache.keys().includes('weather')) {
    // ...
}

Стратегии кэширования для TypeScript

Выбор стратегии зависит от характера данных:

  • Write-through — данные записываются в кэш и БД одновременно. Гарантирует консистентность, но увеличивает время записи.
  • Write-behind — запись в кэш мгновенная, в БД — асинхронно. Быстро, но возможна потеря данных при сбое.
  • Cache-aside — приложение само проверяет кэш, при промахе читает из БД и заполняет кэш. Самый популярный паттерн.

Реализация Cache-aside на TypeScript с ioredis:

async function getUserById(id: number) {
    const cacheKey = `user:${id}`;
    const cached = await redis.get(cacheKey);

    if (cached) {
        return JSON.parse(cached);
    }

    // Промах кэша — идём в БД
    const user = await db.users.findUnique({ where: { id } });

    if (user) {
        await redis.set(cacheKey, JSON.stringify(user), 'EX', 3600); // 1 час
    }

    return user;
}

Продвинутые возможности Redis для TypeScript

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