Кэширование в TypeScript: Redis, Memcached и in-memory решения

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

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

Начать курс

Кэширование в TypeScript: Redis, Memcached и in-memory решения

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

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

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

  • Сохранение результатов дорогостоящих вычислений
  • Кэширование ответов от внешних API
  • Хранение сессий пользователей
  • Кэширование фрагментов HTML-страниц

1. ioredis — продвинутый клиент для Redis

ioredis — самая популярная библиотека для работы с Redis в Node.js и TypeScript. Она поддерживает кластеризацию, Pub/Sub, транзакции и автоматическое переподключение.

Установка:

npm install ioredis
npm install @types/ioredis --save-dev

Базовое использование с TypeScript:

import Redis from 'ioredis';

// Подключение к локальному Redis
const redis = new Redis({
    host: 'localhost',
    port: 6379,
    retryStrategy: (times) => Math.min(times * 50, 2000)
});

// Функция для кэширования данных
async function getCachedData(key: string): Promise<string | null> {
    const cached = await redis.get(key);
    if (cached) {
        console.log('Данные из кэша');
        return cached;
    }
    // Имитация получения данных из БД
    const data = `Data for ${key} at ${new Date().toISOString()}`;
    await redis.setex(key, 3600, data); // TTL 1 час
    return data;
}

// Пример использования
(async () => {
    const result = await getCachedData('user:123');
    console.log(result);
})();

Кэширование объектов:

interface User {
    id: number;
    name: string;
    email: string;
}

async function cacheUser(user: User): Promise<void> {
    await redis.setex(`user:${user.id}`, 3600, JSON.stringify(user));
}

async function getUserFromCache(id: number): Promise<User | null> {
    const cached = await redis.get(`user:${id}`);
    return cached ? JSON.parse(cached) : null;
}

2. node-cache — простое in-memory кэширование

node-cache — лёгкая библиотека для хранения данных в оперативной памяти процесса Node.js. Идеально подходит для небольших проектов или прототипов, где не требуется распределённое кэширование.

Установка:

npm install node-cache
npm install @types/node-cache --save-dev

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

import NodeCache from 'node-cache';

const myCache = new NodeCache({
    stdTTL: 600, // время жизни по умолчанию (сек)
    checkperiod: 120 // период проверки устаревших ключей
});

// Сохранение и получение данных
myCache.set('key1', { value: 42 });
const value = myCache.get('key1');
console.log(value); // { value: 42 }

// Проверка существования ключа
if (myCache.has('key1')) {
    console.log('Ключ существует');
}

// Удаление по ключу
myCache.del('key1');

// Получение статистики
const stats = myCache.getStats();
console.log(`Ключей в кэше: ${stats.keys}`);

3. lru-cache — кэш с политикой LRU

lru-cache — реализация кэша с алгоритмом вытеснения Least Recently Used. Ограничивает количество хранимых записей, автоматически удаляя самые старые. Отлично подходит для кэширования с фиксированным размером.

Установка:

npm install lru-cache

Пример на TypeScript:

import { LRUCache } from 'lru-cache';

const cache = new LRUCache<string, any>({
    max: 500, // максимальное количество записей
    ttl: 1000 * 60 * 5 // TTL 5 минут
});

// Использование
cache.set('config:app', { theme: 'dark', lang: 'ru' });
const config = cache.get('config:app');

// Проверка наличия
if (cache.has('config:app')) {
    console.log('Конфигурация в кэше');
}

// Удаление
cache.delete('config:app');
cache.clear(); // полная очистка

4

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