Кэширование в 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) — данные живут фиксированное
Также в библиотеке
ts-jest для TypeScript: полное руководство с примерами
Eigen для C++: полное руководство с примерами
Работа с Markdown в Go: библиотеки blackfriday, goldmark и chroma
JavaMail (Jakarta Mail) для Java: полное руководство с примерами