Кэширование в 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
Также в библиотеке
Отправка SMS на C# (.NET): API библиотеки и примеры кода
Геолокация и карты в Swift для iOS/macOS: полное руководство
Обработка изображений на Rust: resize и crop с image и imageproc
Генератор QR-кодов на Swift: библиотека EFQRCode для iOS и macOS
MailKit для C# (.NET): полное руководство с примерами