Кэширование в 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
Также в библиотеке
OneOf для C# (.NET): полное руководство с примерами
PHP-CS-Fixer для PHP: полное руководство с примерами
Мониторинг Node.js: инструменты и библиотеки для отслеживания производительности
ORM для Java: сравнение Hibernate, MyBatis и JPA с примерами