Библиотека Cash предназначена для упрощения работы с кешем данных в JavaScript-приложениях. Она позволяет сохранять промежуточные результаты вычислений, минимизировать повторные запросы к серверу и ускорять работу сложных алгоритмов. Ключевая идея заключается в хранении данных в локальном кеше с возможностью автоматического истечения срока действия или ручного контроля.
Кеш в Cash работает на основе ключ-значение, где ключом может быть строка, объект или комбинация параметров функции. Значение может быть любым объектом Jav * aScript: массивом, объектом, функцией или примитивом.
Для начала необходимо создать экземпляр кеша:
import Cash from 'cash';
const cache = new Cash({ ttl: 60000 }); // ttl — время жизни в миллисекундах
Параметры конструктора:
ttl — время жизни кеша по умолчанию для всех
элементов.maxSize — максимальное количество элементов в кеше. При
превышении старые записи удаляются автоматически.onEvict — функция обратного вызова, вызываемая при
удалении элемента.Добавление и получение данных:
cache.set('user_123', { name: 'Alice', age: 30 });
const user = cache.get('user_123');
Метод get возвращает undefined, если ключ
не найден или истек срок действия.
Удаление и очистка кеша:
cache.delete('user_123'); // удаление конкретного элемента
cache.clear(); // полная очистка кеша
Cash позволяет кешировать результат выполнения функции, что особенно полезно для дорогих вычислений или асинхронных запросов.
async function fetchData(id) {
// имитация сетевого запроса
return new Promise(resolve => setTimeout(() => resolve({ id, value: Math.random() }), 1000));
}
const cachedFetch = cache.wrap('data_1', fetchData, 60000);
Метод wrap:
Promise и асинхронные функции.Можно использовать динамические ключи:
const cachedFetchDynamic = (id) => cache.wrap(`data_${id}`, () => fetchData(id), 60000);
В Cash можно задавать разные стратегии устаревания:
cache.set('temp', 42, { ttl: 5000 });
cache.set('dynamic', 'value', {
ttl: () => Math.random() * 10000
});
Для анализа производительности кеша Cash предоставляет встроенные методы профилирования:
cache.stats() — возвращает объект со
статистикой:
hits — количество обращений к кешу, когда элемент был
найден.misses — количество обращений к кешу, когда элемент
отсутствовал.keys — количество текущих элементов.evictions — количество удаленных элементов.Пример использования:
cache.get('user_123'); // miss
cache.get('user_123'); // hit
console.log(cache.stats());
// { hits: 1, misses: 1, keys: 1, evictions: 0 }
Статистика помогает выявить узкие места в производительности приложения, например:
misses) указывают на неправильную
стратегию ключей или слишком короткий TTL.evictions говорит о том, что кеш
слишком маленький и элементы удаляются преждевременно.hits при большом количестве запросов указывает
на необходимость оптимизации ключей или кешируемых функций.Cash полностью поддерживает асинхронные операции:
async function getData(id) {
return cache.wrap(`item_${id}`, async () => {
const response = await fetch(`/api/item/${id}`);
return response.json();
}, 30000);
}
Профилирование асинхронных вызовов позволяет:
maxSize предотвращает переполнение памяти.wrap для функций:
сокращает повторные вычисления и сетевые запросы.stats: постоянное
отслеживание метрик кеша помогает находить узкие места.set, delete, evict для тонкой
настройки логики:cache.on('evict', (key, value) => {
console.log(`Удалён элемент: ${key}`, value);
});
Эти механизмы делают Cash мощным инструментом для профилирования, анализа и оптимизации производительности JavaScript-приложений. Правильное использование кеша снижает нагрузку на сервер, уменьшает время отклика и позволяет точно выявлять узкие места в вычислительных цепочках.