Кэширование в JavaScript (Node.js): Redis и другие инструменты
Кэширование — одна из ключевых стратегий оптимизации производительности серверных приложений на Node.js. Оно позволяет снизить нагрузку на базы данных, уменьшить время отклика API и сократить затраты на инфраструктуру. В этой статье мы разберём основные инструменты кэширования для Node.js: Redis, Node-Cache (встроенная библиотека) и Memcached, сравним их подходы и покажем реальные примеры кода.
Зачем нужно кэширование в Node.js?
Без кэша каждый запрос к популярному ресурсу может приводить к многократным обращениям к базе данных или внешним API. Кэш сохраняет часто запрашиваемые данные в быстром хранилище (оперативная память), что даёт:
- Снижение времени ответа (latency) с 100-500 мс до 1-5 мс.
- Уменьшение количества запросов к БД и внешним сервисам.
- Повышение пропускной способности сервера (RPS).
1. Redis — король кэширования
Redis — это in-memory хранилище данных типа "ключ-значение", которое часто используется как кэш, брокер сообщений и база данных. В Node.js для работы с Redis используется библиотека redis (или ioredis).
Установка и подключение
npm install redis
const redis = require('redis');
const client = redis.createClient({
url: 'redis://localhost:6379'
});
client.on('error', (err) => console.error('Redis Error:', err));
await client.connect();
// Пример кэширования данных с TTL
async function getCachedData(key) {
const cached = await client.get(key);
if (cached) return JSON.parse(cached);
const freshData = { message: 'Hello from DB', time: Date.now() };
await client.setEx(key, 60, JSON.stringify(freshData)); // TTL 60 сек
return freshData;
}
Особенности Redis для Node.js
- Поддержка TTL — автоматическое удаление устаревших записей.
- Структуры данных — строки, списки, множества, хеши, сортированные множества.
- Pub/Sub — можно строить системы real-time уведомлений.
- Кластеризация — горизонтальное масштабирование без потери производительности.
2. Node-Cache — лёгкий in-memory кэш без внешних зависимостей
Node-Cache — это простая библиотека для кэширования данных прямо в памяти процесса Node.js. Идеально подходит для небольших проектов, микросервисов или когда не хочется поднимать Redis.
Установка и пример
npm install node-cache
const NodeCache = require('node-cache');
const myCache = new NodeCache({ stdTTL: 100, checkperiod: 120 });
// Сохранение данных
myCache.set('user:123', { name: 'Alice', role: 'admin' });
// Получение данных
const user = myCache.get('user:123');
if (user === undefined) {
// данных нет в кэше — нужно загрузить из БД
console.log('Cache miss');
} else {
console.log('Cache hit:', user);
}
// Удаление по ключу
myCache.del('user:123');
// Очистка всего кэша
myCache.flushAll();
Плюсы и минусы Node-Cache
- Плюсы: не требует внешнего сервера, простой API, автоматическая очистка по TTL.
- Минусы: кэш хранится только в одном процессе — при рестарте сервера данные теряются; нельзя использовать между несколькими инстансами Node.js.
3. Memcached — распределённый кэш с минимальным оверхедом
Memcached — ещё одно популярное in-memory хранилище, оптимизированное для кэширования. В Node.js чаще всего используется библиотека memcached.
Установка и пример
npm install memcached
const Memcached = require('memcached');
const memcached = new Memcached('localhost:11211');
// Сохранение с TTL 60 секунд
memcached.set('api:weather', JSON.stringify({ temp: 22 }), 60, (err) => {
if (err) console.error('Memcached set error:', err);
});
// Получение
memcached.get('api:weather', (err, data) => {
if (data) {
console.log('Cache hit:', JSON.parse(data));
} else {
console.log('Cache miss или